ACM-ICPC LA 4329 Ping pong(树状数组)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2330

参考资料:《算法入门经典训练指南》刘汝佳 P197

这本书上面写的题目大意、解题思路都写出来了。

在这我贴上自己的

AC代码:

 #include<stdio.h>
#include<string.h> #define PEOPLE 20001
#define VALUE 100001 typedef long long LL; int n, a[PEOPLE], amin[PEOPLE], amax[PEOPLE], tree[VALUE]; int lowbit(int x){
return x & -x;
} void add(int x, int d){
while(x < VALUE){
tree[x] += d;
x += lowbit(x);
}
} int sum(int x){
int ret = ;
while(x > ){
ret += tree[x];
x -= lowbit(x);
}
return ret;
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = ; i <= n; ++i){
scanf("%d", &a[i]);
} memset(tree, , sizeof(tree));
for(int i = ; i <= n; ++i){
amin[i] = sum(a[i] - );//第i个人 统计在第i个人的左边并且技能值小于 的总人数
amax[i] = i - - amin[i];//统计 技能值大于第i个人并且在左边的总人数
add(a[i], );
} LL ans = ;
memset(tree, , sizeof(tree));
for(int i = n; i >= ; --i){
LL bmin = sum(a[i] - );//统计 技能值小于第i个人并且在第i个人的右边的总人数
ans += bmin * amax[i] + (n - i - bmin) * amin[i];
add(a[i], );
}
printf("%lld\n", ans);
}
return ;
}
上一篇:TortoiseGit 图标不显示


下一篇:C++多态性:虚函数的调用原理