Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8532 | Accepted: 2290 |
Description
Input
Output
Test case (case number): (number of crossings)
Sample Input
1 3 4 4 1 4 2 3 3 2 3 1
Sample Output
Test case 1: 5
Source
WA了差不多10次。。。。。悲剧啊。。。。虽然N,M是到1000,可是节点的数量是会超INT的范围的。。。。接着就是节点是否重合的问题。。。。这个真的很难办。。。。最后我直接将Y俺减序排列,接着X按减序排,最后记录下每个X重合的数目,因为X的范围是1000,接着得到SUM,再减去每个X重合的数目Y (Y-1)Y/2,这一条是画图看出来的
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct t
{
int x,y;
__int64 value;
}e[1000010];
int n,m,k;
__int64 tree[1005];
bool cmp(t a, t b)
{
if(a.y!=b.y) return a.y>b.y;
return a.x>b.x;
}
inline int Lowbit(int x)
{
return x&(-x);
}
void Update(int x)
{
for(int i=x;i<=1000;i+=Lowbit(i))
tree[i]++;
}
__int64 Getsum(int x)
{
__int64 temp=0;
for(int i=x;i>0;i-=Lowbit(i))
temp+=tree[i];
return temp;
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
memset(tree,0,sizeof(tree));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
scanf("%d%d",&e[i].x,&e[i].y);
sort(e+1,e+k+1,cmp);
for(int i=1;i<=k;i++)
{
e[i].value=Getsum(e[i].x);
Update(e[i].x);
}
int d=0;
__int64 sum=0;
int ss[1001]={0};
for(int i=1;i<=k;i++)
{
ss[e[i].x]++;
sum+=e[i].value;
}
for(int i=1;i<1001;i++)
{
sum-=(ss[i])*(ss[i]-1)/2;
}
printf("Test case %d: %I64d/n",cas++,sum);
}
return 0;
}