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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板)

發布時間:2025/7/25 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Bubble Sort

題意:

給你一個1~n的排列,問冒泡排序過程中,數字i(1<=i<=n)所到達的最左位置與最右位置的差值的絕對值是多少

題解:

數字i多能到達的最左位置為min(s[i],i)
i為它的初始位置,s[i]為它的最終位置(因為最后是排好序,這個數是多少,就排在哪個位置,故為s[i])
那最右位置呢?
就是判斷數i初始時,右邊有多少個數比i小,這個就能用樹狀數組來求解了
循環從右到左,對于數s[i],我們只需判斷它右邊1~s[i]-1中有幾個數即可

樹狀數組是從1開始,所以輸入盡量也從1開始

代碼:

#include <bits/stdc++.h> using namespace std;typedef long long ll; const int INF=0x3f3f3f3f; const ll LINF=0x3f3f3f3f3f3f3f3f; #define PI(A) cout<<(A)<<endl #define SI(N) cin>>(N) #define SII(N,M) cin>>(N)>>(M) #define cle(a,val) memset(a,(val),sizeof(a)) #define rep(i,b) for(int i=0;i<(b);i++) #define Rep(i,a,b) for(int i=(a);i<=(b);i++) #define reRep(i,a,b) for(int i=(a);i>=(b);i--) #define dbg(x) cout <<#x<<" = "<<(x)<<endl #define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl; #define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;} const double EPS= 1e-9 ;/* / C o d i n g S p a c e / */const int MAXN= 100000+ 9 ; int s[MAXN],N,l[MAXN],r[MAXN];//樹狀數組 范圍是[1,n] int bit[MAXN]; //求前i項和 int SUM(int i) {int s=0;while(i>0){s+=bit[i];i-=i&-i;}return s; } //bit[i]+x void ADD(int i,int x) {while(i<=MAXN){bit[i]+=x;i+=i&-i;} }int main() {int o;SI(o);Rep(T,1,o){cle(bit,0);int ma=0;SI(N);Rep(i,1,N) SI(s[i]);Rep(i,1,N) l[s[i]]=min(s[i],i);for (int i=N;i>0;i--){r[s[i]]=i+SUM(s[i]-1);ADD(s[i],1);}cout<<"Case #"<<T<<":";Rep(i,1,N) cout<<" "<<abs(l[i]-r[i]);cout<<endl;}return 0; }

轉載于:https://www.cnblogs.com/s1124yy/p/5741411.html

總結

以上是生活随笔為你收集整理的2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板)的全部內容,希望文章能夠幫你解決所遇到的問題。

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