http://poj.org/problem?id=1990 这题调试了n久!!!就是因为变量名有点乱,自己也乱了。 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int num_small[20010],sum_small[20010]; int Max; struct node { int val,pos; }a[20010]; void update(int i,int num,int *c) { while(i<=Max) { c[i]+=num; i+=i&(-i); } } __int64 sum(int i,int *c) { __int64 ans=0; while(i>0) { ans+=c[i]; i-=i&(-i); } return ans; } bool cmp(node a,node b) { return a.val<b.val; } int main() { int n; scanf("%d",&n); int i; Max=0; for(i=1;i<=n;i++) { int x,y; scanf("%d%d",&a[i].val,&a[i].pos); if(a[i].pos>Max) Max=a[i].pos; } sort(a+1,a+n+1,cmp); memset(num_small,0,sizeof(num_small)); memset(sum_small,0,sizeof(sum_small)); __int64 ans=0; __int64 sum_x=a[1].pos;//a[i]前面所有数总和 update(a[1].pos,1,num_small); update(a[1].pos,a[1].pos,sum_small); __int64 num_min,sum_min; for(i=2;i<=n;i++) { num_min=sum(a[i].pos,num_small);//a[i]前面比a[i]小的数的个数 sum_min=sum(a[i].pos,sum_small);//a[i]前面比a[i]小的数的和 ans+=a[i].val*(num_min*a[i].pos-sum_min+sum_x-sum_min-(i-num_min-1)*a[i].pos); update(a[i].pos,1,num_small); update(a[i].pos,a[i].pos,sum_small); sum_x+=a[i].pos; } printf("%I64d/n",ans); return 0; }