poj 3067 Japan
#include <iostream> //树状数组,同poj 2155 stars
using namespace std;
const int maxm=1005;
int table[maxm],link[1000010][2],t,m,n,k,i,j;
int cmp(const void* a,const void* b)
{
if( ((int *)a)[0] == ((int *)b)[0] )
return ((int *)a)[1] - ((int *)b)[1];
else
return ((int *)a)[0]-((int *)b)[0];
}
int lowbit(int x)
{
return x&(-x);
}
void modify(int x) //修改的是[1,x-1]区间
{
x--; //注意这里要x--
while(x>0)
{
table[x]++;
x-=lowbit(x);
}
}
int sum(int x) //求的是一个节点
{
int s=0;
while(x<=m)
{
s+=table[x];
x+=lowbit(x);
}
return s;
}
int main()
{
scanf("%d",&t);
for(i=1;i<=t;++i)
{
memset(table,0,sizeof(table));
scanf("%d%d%d",&n,&m,&k);
for(j=0;j<k;++j)
{
scanf("%d%d",&link[j][0],&link[j][1]);
}
qsort(link,k,sizeof(link[0]),cmp);
long long total=0; //如果是int的就WA了
for(j=0;j<k;++j)
{
total+=sum(link[j][1]);
modify(link[j][1]);
}
printf("Test case %d: %lld\n",i,total);
}
return 0;
}