这题有几个小地方值得注意一下。
1.相交条件。相信学过直角坐标系直线的相交的人都知道怎么判定的。处理的技巧为先排序。
2.数组要开的足够大。注意题目k没有取值范围。
3.ans要用longlong,不然可能溢出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1010
long long c[maxn],ans;
struct node
{
int x,y;
}a[10000000];
int cmp(const void *a,const void *b)
{
node *aa=(node*)a;
node *bb=(node*)b;
if(aa->x!=bb->x)
return bb->x-aa->x;
else return bb->y-aa->y;
}
int lowbit(int i)
{return i&(-i);}
long long sum(int i)
{
long long s=0;
while(i)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
void update(int i)
{
while(i<=maxn)
{
c[i]+=(long long)1;
i+=lowbit(i);
}
}
int main()
{
int T,n,m,k;
scanf("%d",&T);
int t=1;
while(T--)
{
memset(c,0,sizeof(c));
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++)
scanf("%d%d",&a[i].x,&a[i].y);
qsort(a,k,sizeof(a[0]),cmp);
ans=0;
for(int i=0;i<k;i++)
{
ans+=sum(a[i].y-1);
update(a[i].y);
}
printf("Test case %d: %lld\n",t++,ans);
}
return 0;
}