2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板)
生活随笔
收集整理的這篇文章主要介紹了
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(树状数组模板)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SwipeRefreshLayout实现
- 下一篇: 从选择到上传,可能是最贴心的高仿朋友圈编