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);
}
}
#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 - 1107 斜率小于0的连线数量(逆序对)
- 51nod 1107 斜率小于0的连线数量(逆序数)
- 51nod-1107 斜率小于0的连线数量(逆序数+离散化)
- 51NOD——N 1107 斜率小于0的连线数量
- 51NOD 1107 斜率小于0的连线数量 坐标离散化+树状数组
- 51nod 1107 斜率小于0的连线数量 树状数组
- 51nod 1107 斜率小于0的连线的数量 (逆序数)
- 51Nod-1107-斜率小于0的连线数量
- 51nod 1107 斜率小于0的连线数量
- 51nod 1107 斜率小于0的连线数量 (树状数组+离线化)
- 51Nod 1107 斜率小于0的连线数量
- CSU-ACM2017暑期训练16-树状数组 D - 斜率小于0的连线数量 51Nod - 1107
- D - 斜率小于0的连线数量 51Nod - 1107
- 斜率小于0的连线数量 51NOD - 1107
- (51Nod - 1107)斜率小于0的连线数量
- 51 nod 1107 斜率小于0的连线数量
- 1107 斜率小于0的连线数量
- 51nod-斜率小于0的连线数量(树状数组+离散化)
- 1107 斜率小于0的连线数量
- 51nod 40 斜率小于0的连线数量 树状数组