题意就是:
在大海的西岸和东岸分别有沿着南北方向的城市,给出了k条从东岸到西岸的路,求这些路的交点。
线段树,挺基础的吧。
挺水的吧。
AC code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(k) k&-k
using namespace std;
typedef long long LL;
const int M=1e6+6;
int n,m,k;
int Max;
struct node{
int a,b;
node(){};
node(int aa,int bb){a=aa,b=bb;}
bool operator <(const node &t)const
{
return a==t.a?b<t.b:a<t.a;
}
};
LL tree[M<<1];
node record[M];
void pre()
{
for(int i=1;;i+=lowbit(i))
{
if(i>=M)
{
Max=i;
break;
}
}
}
LL query(int x)
{
int sum=0;
for(int i=x;i>=1;i-=lowbit(i))
{
sum+=tree[i];
}
return tree[Max]-sum;
}
void update(int x)
{
for(int i=x;i<=Max;i+=lowbit(i))
tree[i]++;
return ;
}
int main()
{
int T;
pre();
while(cin>>T)
{
for(int j=1;j<=T;++j)
{
memset(tree,0,sizeof(tree));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;++i)
{
scanf("%d%d",&record[i].a,&record[i].b);
}
sort(record+1,record+k+1);
LL ans=0;
for(int i=1;i<=k;++i)
{
ans+=query(record[i].b);
update(record[i].b);
}
printf("Test case %d: ",j);
cout<<ans<<endl;
}
}
}