Click here http://vjudge.net/contest/view.action?cid=49139#problem/G
(1)先说说这道题吧,被坑了好几次,最先是用cin 代替scanf 超时,另外就是wrong answer ,这是因为输出格式用%d代替了%lld,
(2) 这道题就是要判断线段相交交点个数,如果朴素枚举的话,肯定会超时,
(3)所以先把一边的点从小到大排序,然后边将一个点插入数组中,边算出交点个数,这就运用到树状数组中的getsum ()方法。
附上代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
struct node
{
int x;
int y;
}a[1000005];
int c[1005];
int cmp(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int lowbit(int t)
{
return t&(-t);
}
void insert(int k,int d,int q)
{
while(k<=q)
{
c[k]+=d;
k+=lowbit(k);
}
}
long long sum(int k)
{
long long t=0;
while(k>0)
{
t+=c[k];
k-=lowbit(k);
}
return t;
}
int main()
{
int i,j,k1,t;
scanf("%d",&k1);
int k0=0;
while(k1--)
{
int n,m,k;
memset(c,0,sizeof(c));
int max=0;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++)
{ scanf("%d%d",&a[i].x,&a[i].y);
if(a[i].y>max)max=a[i].y;
}
sort(a,a+k,cmp);
long long Sum=0;
insert(a[0].y,1,max);
for(int i=1;i<k;i++)
{
Sum+=sum(max)-sum(a[i].y);
insert(a[i].y,1,max);
}
k0++;
printf("Test case %d: %lld\n",k0,Sum);
}
return 0;
}