树状数组求逆序数
斜率小于0,就是在x从小到大的情况下,看y序列有多少逆序数。要对y离散化,注意x相等的情况。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50010;
struct node
{
int x,y;
};
node ns[MAXN];
int bit[MAXN];
bool cmp1(const node& a, const node& b)
{
return a.y < b.y;
}
void add(int i, int x)
{
while(i <= MAXN)
{
bit[i] += x;
i += i&-i;
}
}
int sum(int i)
{
int ret = 0;
while(i > 0)
{
ret += bit[i];
i -= i&-i;
}
return ret;
}
bool cmp2(const node& a, const node& b)
{
if(a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%d %d",&ns[i].x,&ns[i].y);
sort(ns,ns+n,cmp1);
int pre = ns[0].y,temp;
ns[0].y = 1;
for(int i = 1; i < n; ++i)
{
temp = ns[i].y;
ns[i].y = ns[i-1].y + (pre<ns[i].y);
pre = temp;
}
sort(ns,ns+n,cmp2);
int res = 0;
for(int i = 1; i <= n; ++i)
{
add(ns[i-1].y,1);
res += i-sum(ns[i-1].y);
}
printf("%d\n",res);
return 0;
}