树状数组的题,很简单,只是我做了一下午,哈哈!都是因为好久没有写代码了,这是个多组测试数据的题,初始化得注意点;树状数组的思想很简单,先排序,然后找交叉点,交叉点的数目等于A数组相对于x位置右边的sum值。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;
struct node {
int e,w;
} tmp[1000010];
long long A[1005];
int MAX_N;
bool operator < (const node & a,const node &b)
{
if(a.e==b.e) return a.w < b.w;
return a.e<b.e;
}
int lowbit(int x)
{
return (-x)&x;
}
void add(int x)
{
for(;x>0;A[x]+=1,x-=lowbit(x));
}
long long sum(int x){
long long s=0;
for(;x<=MAX_N;s+=A[x],x+=lowbit(x));
return s;
}
int main()
{
//freopen("in.txt","r",stdin);
int n_case,N,M,K;
long long res;
scanf("%d",&n_case);
for(int i=0; i<n_case; i++) {
scanf("%d%d%d",&N,&M,&K);
res=0;MAX_N=M;
memset(A,0,sizeof(A));
for(int j=0; j<K; j++) {
scanf("%d%d",&tmp[j].e,&tmp[j].w);
}
sort(tmp,tmp+K);
for(int k=0;k<K;k++)
{
res+=sum(tmp[k].w+1);
add(tmp[k].w);
}
printf("Test case %d: %I64d\n",i+1,res);
}
return 0;
}