本来应该是到很简单的题目的,暴力也可以过的只不过效率差点而已(n方)
所以想用树状数组求解,但要注意几个问题,就是
1.树状数组不能为0;
2.要用离散化处理数据。
都是要仔细才能发现的
不说了上代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#define M 500008
using namespace std;
int c[M];
int n;
int lowbit(int i)
{
return i&(-i);
}
void add(int i)
{
while(i<M)
{
c[i]++;
i+=lowbit(i);
}
}
int sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
int main()
{
freopen("in.txt","r",stdin);
int ans;
int temp;
while(scanf("%d",&n),n)
{
memset(c,0,sizeof(c));
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
add(temp+1);
ans+=i-sum(temp+1);
}
printf("%d\n",ans);
}
printf("sada");
return 0;
}
这是没用离散的
用离散化的话要加东西
struct Node
{
int val;
int pos;
};
修改过的代码出来了,成功AC哈哈
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define M 500008
using namespace std;
int c[M];
int n;
int temp[M];
struct node {int v;int id;}p[M];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int lowbit(int i)
{
return i&(-i);
}
void add(int i)
{
while(i<M)
{
c[i]++;
i+=lowbit(i);
}
}
int sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
int main()
{
freopen("in.txt","r",stdin);
long long ans;
while(scanf("%d",&n),n)
{
memset(c,0,sizeof(c));
memset(temp,0,sizeof(temp));
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i].v);
p[i].id=i;
}
sort(p+1,p+1+n,cmp);
for(int i=1;i<=n;i++)
temp[p[i].id]=i;
for(int i=1;i<=n;i++)
{
add(temp[i]);
ans+=i-sum(temp[i]);
}
printf("%lld\n",ans);
}
return 0;
}
对比下看下有什么不同吧,学到点东西就好。。。
380

被折叠的 条评论
为什么被折叠?



