您的位置:首页 > 其它

51nod 1107 斜率小于0的连线数量

2016-11-20 20:29 232 查看
将点按横坐标x排序,然后提取纵坐标y,求逆序数对即可。

#include <bits/stdc++.h>
using namespace std;

const int MAXN=50050;

struct node
{
int x,y;
}nod[MAXN];

bool cmp(node n1,node n2)
{
if(n1.x!=n2.x)
return n1.x<n2.x;
return n1.y<n2.y;
}

int a[MAXN];
long long ans;

void merge(int lef,int rig)
{
if(lef==rig)
return;
if(lef==rig-1)
{
if(a[lef]>a[rig])
ans++;
return;
}
int mid,i;
mid=(lef+rig)>>1;
merge(lef,mid);
merge(mid+1,rig);
sort(a+mid+1,a+rig+1);
for(i=lef;i<=mid;i++)
ans+=lower_bound(a+mid+1,a+rig+1,a[i])-(a+mid+1);
}

int main()
{
int i,n;
while(cin>>n)
{
for(i=0;i<n;i++)
scanf("%d%d",&nod[i].x,&nod[i].y);
sort(nod,nod+n,cmp);
for(i=0;i<n;i++)
a[i]=nod[i].y;
ans=0;
merge(0,n-1);
printf("%lld\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod 分治