题目链接:点击打开链接
树状数组模板题
本题的数字每个都是不同的所以可以从大到小排,再边插入边查询。如果有重复的数字,需要从小到大排,然后每次res+=N-query(pos)
结果会超int
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
#include <algorithm>
using namespace std;
int c[500010];
struct node{
int id;
ll num;
}a[500010];
int N;
bool cmp(node a,node b){
return a.num>b.num;
}
int lowbit(int n){
return n&(-n);
}
void add(int p,int n){
while(p<=N){
c[p]+=n;
p+=lowbit(p);
}
}
int query(int p){
int res=0;
while(p>0){
res+=c[p];
p-=lowbit(p);
}
return res;
}
int main(){
while(~scanf("%d",&N)){
memset(c,0,sizeof(c));
if(!N) break;
for(int i=1;i<=N;i++){
scanf("%I64d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+N+1,cmp);
ll res=0;
for(int i=1;i<=N;i++){
res+=query(a[i].id);
add(a[i].id,1);
}
printf("%I64d\n",res);
}
return 0;
}
本文介绍了一道经典的树状数组模板题,并提供了详细的代码实现。通过从大到小排序并边插入边查询的方式,有效地解决了问题。适用于解决涉及不同数字的场景。

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



