#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
int bit[5000];
struct line
{
int x,y;
}L[500000];
bool cmp(line a,line b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
void add(int i)
{
while(i<=5000)
{
bit[i]+=1;
i+=i&-i;
}
}
long long int sum(int i)
{
long long int res=0;
while(i>0)
{
res+=bit[i];
i-=i&-i;
}
return res;
}
int main()
{
int T,t;
long long res;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
memset(bit,0,sizeof(bit));
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&L[i].x,&L[i].y);
}
sort(L,L+k,cmp);
res=0;
for(int i=0;i<k;i++)
{
res+=i-sum(L[i].y);
add(L[i].y);
}
printf("Test case %d: %lld\n",t,res);
}
}
poj 3067 树状数组求逆序数(n条线段相交的交点个数)
最新推荐文章于 2021-02-26 21:51:37 发布