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;
}

  

posted on 2011-07-22 16:42  sysu_mjc  阅读(160)  评论(0编辑  收藏  举报

导航