题意:在一个弹丸之地,有两排城市,每两个城市之间有一条道路相连,问有多少个可以产生交际
思路:利用树状数组,求逆序数。首先对道路进行排序,然后求解。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
int c[1050];
int Max;
struct node
{
int x;
int y;
bool friend operator <(const node &a,const node &b)
{
if(a.x!=b.x)
return a.x>b.x;
else
return a.y>b.y;
}
};
priority_queue<node>Q;
int lowbit(int n)
{
return (-n)&n;
}
long long get_sum(int n)
{
long long ans=0;
while(n<=1010)
{
ans+=c[n];
n+=lowbit(n);
}
return ans;
}
void up_data(int n)
{
while(n>0)
{
c[n]++;
n-=lowbit(n);
}
}
int main()
{
int T;
scanf("%d",&T);
int N,M,K;
long long TestAns;
node tem;
for(int t=1;t<=T;t++)
{
memset(c,0,sizeof(c));
scanf("%d%d%d",&N,&M,&K);
for(int i=0; i<K; i++)
{
scanf("%d%d",&tem.x,&tem.y);
Q.push(tem);
}
int Max=M;
TestAns=0;
for(int i=0; i<K; i++)
{
tem=Q.top();
Q.pop();
TestAns+=get_sum(tem.y+1);
// printf("%I64d\n",TestAns);
up_data(tem.y);
}
printf("Test case %d: %I64d\n",t,TestAns);
}
return 0;
}