题目链接:http://poj.org/problem?id=3067
题目大意:左边给你1-N个城市,右边给你1-M个城市,给你K条路,问这些路一共有多少个交点,两条路至多有一个交点。
解题思路:先按右端点从大到小排序,如果右端点想等,按左端点从大到小排序,然后就是树状数组了,注意两条路在城市相交不算作交点,另外交点个数会超Int。
代码如下:
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 1000003
struct node
{
int s;int e;
}c[1000005];
int s[1000005];
bool cmp(node a,node b)
{
if(a.e==b.e) return a.s>b.s;
return a.e>b.e;
}
int lowbit(int x)
{
return x&(-x);
}
void insert(int x)
{
while(x<=N)
{
s[x]+=1;
x+=lowbit(x);
}
}
int get_sum(int x)
{
int sum=0;
while(x>0)
{
sum+=s[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int T,n,m,k,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
memset(s,0,sizeof(s));
for(int i=0;i<k;i++)
scanf("%d%d",&c[i].s,&c[i].e);
sort(c,c+k,cmp);
long long int ans=0;
for(int i=0;i<k;i++)
{
ans+=get_sum(c[i].s-1);
insert(c[i].s);
}
printf("Test case %d: %lld\n",cas++,ans);
}
return 0;
}