1164: 分治 逆序对
生活随笔
收集整理的這篇文章主要介紹了
1164: 分治 逆序对
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1164: 分治 逆序對
時間限制:?1 Sec??內存限制:?128 MB題目描述
給一列數a1,a2,...,an,求它的逆序對數,即有多少個有序對(i,j),使得i<j且ai>aj。n可以高達10^6。輸入
第一行輸入整數N(2<=N<=10^6). 接下來一行N個正整數數分別是a1,a2,...,an(ai<=10^6)。輸出
輸出一個數表示逆序對數。樣例輸入
4
2 4 3 1
樣例輸出
4
重點體會分治思想!!
要熟練會寫,有一道叫做手套的題就考了逆序對,一會貼上。 這里直接粘代碼了 [cpp]?view plaincopy- #include<iostream>???
- #include<cstdio>???
- using?namespace?std;???
- int?n,a[2000001],i,c[2000001];???
- long?long?ans;???
- void?x(int?l,int?r)???
- {???
- ????int?mid=(l+r)/2,i,j,tmp;???
- ????if(r>l)???
- ????{???
- ????????x(l,mid);???
- ????????x(mid+1,r);???
- ????????tmp=l;???
- ????????for(i=l,j=mid+1;i<=mid&&j<=r;)???
- ????????{???
- ????????????if(a[i]>a[j])???
- ????????????{???
- ????????????????c[tmp++]=a[j++];???
- ????????????????ans+=mid-i+1;???
- ????????????}???
- ????????????else?c[tmp++]=a[i++];???
- ????????}???
- ????????if(i<=mid)?for(;i<=mid;)?c[tmp++]=a[i++];???
- ????????if(j<=r)?for(;j<=r;)?c[tmp++]=a[j++];???
- ????????for(i=l;i<=r;i++)?a[i]=c[i];???
- ????}???
- }???
- int?main()???
- {???
- ????cin>>n;???
- ????for(i=1;i<=n;i++)?scanf("%d",&a[i]);???
- ????x(1,n);???
- ????cout<<ans;???
- }??
- #include<cstdio>????
- #include<iostream>????
- #include<algorithm>????
- using?namespace?std;????
- int?A[9000010]={0},T[9000010]={0};???
- long?long?cnt=0;????
- void?merge_sort(int?x,int?y)????
- {????
- ????if(y-x>=1){????
- ??????????int?m=(y-x)/2+x;????
- ??????????int?p=x,q=m+1,i=x;????
- ??????????merge_sort(x,m);????
- ???????????merge_sort(m+1,y);????
- ???????????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+1-p;}????
- ???????????}????
- ???????????for(i=x;i<=y;i++)A[i]=T[i];????
- ????}????
- ??????????
- }????
- int?main()????
- {????
- ???????int?n,m,ans=0,i,k;????
- ???????scanf("%d",&n);????
- ???????for(i=0;i<n;i++)????
- ???????{????
- ???????????scanf("%d",&A[i]);????
- ?????????????????
- ???????}????
- ????????merge_sort(0,n-1);????
- ????????printf("%lld",cnt);????
- ?????????????
- }???
總結
以上是生活随笔為你收集整理的1164: 分治 逆序对的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1995年的5元硬币现在卖值多少钱?
- 下一篇: Shuo开头的成语有哪些?