日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

1164: 分治 逆序对

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  1. #include<iostream>???
  2. #include<cstdio>???
  3. using?namespace?std;???
  4. int?n,a[2000001],i,c[2000001];???
  5. long?long?ans;???
  6. void?x(int?l,int?r)???
  7. {???
  8. ????int?mid=(l+r)/2,i,j,tmp;???
  9. ????if(r>l)???
  10. ????{???
  11. ????????x(l,mid);???
  12. ????????x(mid+1,r);???
  13. ????????tmp=l;???
  14. ????????for(i=l,j=mid+1;i<=mid&&j<=r;)???
  15. ????????{???
  16. ????????????if(a[i]>a[j])???
  17. ????????????{???
  18. ????????????????c[tmp++]=a[j++];???
  19. ????????????????ans+=mid-i+1;???
  20. ????????????}???
  21. ????????????else?c[tmp++]=a[i++];???
  22. ????????}???
  23. ????????if(i<=mid)?for(;i<=mid;)?c[tmp++]=a[i++];???
  24. ????????if(j<=r)?for(;j<=r;)?c[tmp++]=a[j++];???
  25. ????????for(i=l;i<=r;i++)?a[i]=c[i];???
  26. ????}???
  27. }???
  28. int?main()???
  29. {???
  30. ????cin>>n;???
  31. ????for(i=1;i<=n;i++)?scanf("%d",&a[i]);???
  32. ????x(1,n);???
  33. ????cout<<ans;???
  34. }??
還有一份 [cpp]?view plaincopy
  1. #include<cstdio>????
  2. #include<iostream>????
  3. #include<algorithm>????
  4. using?namespace?std;????
  5. int?A[9000010]={0},T[9000010]={0};???
  6. long?long?cnt=0;????
  7. void?merge_sort(int?x,int?y)????
  8. {????
  9. ????if(y-x>=1){????
  10. ??????????int?m=(y-x)/2+x;????
  11. ??????????int?p=x,q=m+1,i=x;????
  12. ??????????merge_sort(x,m);????
  13. ???????????merge_sort(m+1,y);????
  14. ???????????while(p<=m||q<=y){????
  15. ????????????????if(q>y||(p<=m&&A[p]<=A[q]))T[i++]=A[p++];????
  16. ????????????????else?{T[i++]=A[q++];cnt+=m+1-p;}????
  17. ???????????}????
  18. ???????????for(i=x;i<=y;i++)A[i]=T[i];????
  19. ????}????
  20. ??????????
  21. }????
  22. int?main()????
  23. {????
  24. ???????int?n,m,ans=0,i,k;????
  25. ???????scanf("%d",&n);????
  26. ???????for(i=0;i<n;i++)????
  27. ???????{????
  28. ???????????scanf("%d",&A[i]);????
  29. ?????????????????
  30. ???????}????
  31. ????????merge_sort(0,n-1);????
  32. ????????printf("%lld",cnt);????
  33. ?????????????
  34. }???

總結

以上是生活随笔為你收集整理的1164: 分治 逆序对的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。