51nod 1107 逆序对

来源:互联网 发布:windows api 窗口置顶 编辑:程序博客网 时间:2024/04/27 15:34

给你一些点,叫你求斜率小0的直线的条数。
现将点按着x从小到大排好,x一样的话按y从小到大排好。求逆序。即可

#include<bits/stdc++.h>using namespace std;typedef long long LL;#define MOD 1000000007#define PI acos(-1.0)#define INF 0x3f3f3f3fconst int maxn=500005;struct point{    int x,y;}P[maxn];int a[maxn],T[maxn];int n;LL cnt;bool cmp(point t1,point t2){    if(t1.x==t2.x)return t1.y<t2.y;    return t1.x<t2.x;}void merge_sort(int *A,int x,int y,int *T){        if(y-x>1){        int m=(x+y)>>1;        int p=x,q=m,i=x;        merge_sort(A,x,m,T);        merge_sort(A,m,y,T);        while(p<m||q<y){            if(q>=y||(p<m&&A[p]<=a[q]))T[i++]=A[p++];            else {T[i++]=A[q++];cnt+=m-p;}//求逆序 cnt+=m-p,求正序 cnt+=y-q        }        for(int i=x;i<y;i++)A[i]=T[i];    }}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d%d",&P[i].x,&P[i].y);    }    sort(P,P+n,cmp);    for(int i=0;i<n;i++){        a[i]=P[i].y;    }    cnt=0;    merge_sort(a,0,n,T);    printf("%lld\n",cnt);    return 0;}
0 0