题目:http://poj.org/problem?id=3067
利用树状数组查找逆序对。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int t,n,m,k; long long f[1005],ans; struct N{ long long aa,bb; }edge[1000005]; bool cmp(N x,N y) { if(x.aa!=y.aa)return x.aa>y.aa; else return x.bb>y.bb; // if(x.aa!=y.aa)return x.aa<y.aa; // else return x.bb<y.bb; } long long query(int x) { long long sum=0; for(;x;x-=x&-x) sum+=f[x]; return sum; } void add(int x) { for(;x<=m;x+=x&-x) f[x]++; } int main() { scanf("%d",&t); for(int g=1;g<=t;g++) { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++) scanf("%lld%lld",&edge[i].aa,&edge[i].bb); sort(edge+1,edge+k+1,cmp); memset(f,0,sizeof f); ans=0;//!!! for(int i=1;i<=k;i++) { add(edge[i].bb); ans+=query(edge[i].bb-1);//-1! // add(edge[i].bb); // ans+=i-query(edge[i].bb); } printf("Test case %d: %lld\n",g,ans); } return 0; }