JZOJ3542氣泡排序

2022-09-11 01:39:15 字數 2227 閱讀 6259

下面是一段實現氣泡排序演算法的c++**:

for (int i=1;i<=n-1;i++) 

for (int j=1;j<=n-i ;j++) 

if(a[j]>a[j+1]) 

swap(a[j],a[j+1]);

其中待排序的a陣列是乙個1~n的排列,swap函式將交換陣列中對應位置的值。

對於給定的陣列a以及給定的非負整數k,使用這段**執行了正好k次swap操作之後陣列a中元素的值會是什麼樣的呢?

n<=1e6  k<=1e12

這題要開long long  

這是道結論題,

在嘗試了各種方法之後,我們嘗試直接構造答案陣列。 

考慮每個數在答案陣列裡的位置。 

定義j掃一遍為一輪。 

分析發現:

1:每個數,每輪最多向左移動乙個位置。

繼續:2:若乙個數左邊有比它大的數,它就一定會左移乙個位置。 

2逆:若它左移乙個位置,則它的左邊一定有數比它大。

再繼續:

3:設前面有t個數比它大,那麼前t輪,每一輪它都會向左移乙個位置,然後它就再不左移。

思路似乎已經清晰。 

設經過x輪移動,在過不到一輪就交換k次。 

先來考慮經過剛好x輪移動的情況。

如果t<=x,那麼它的位置在**? 

這種情況就是,乙個數左移到一半就停止不移動了。 

顯然它的位置是可求的。 

如果t>x,那麼它的位置又在**? 

這種數不會再左移,也就說明它的左邊沒有比它大的數。 

推出結論:

4:這部分數的位置一定是隨著值而遞增的。

我們現在已經知道一部分數的具體位置了,把剩下的數按從小到大的順序填到空位置裡就好了。

現在已經知道了x輪移動的答案,還剩下一點交換次數,就直接來一輪氣泡排序就好了。

5:發現:交換次數=左移次數。

根據結論2的逆結論,統計每一輪的左移次數就好了。

- by  我們都是星塵

那麼,如果我們知道k次交換後一共完整地進行了x輪的話,就可以把「 

for(int i=1; i」 這重迴圈給省掉,而直接o(n)計算殘缺的第二重迴圈,既然已經知道x輪移動的答案,而這個答案肯定是單調遞增的,就可以通過二分列舉x。

#include#include#include#include#include#include#include#define ll long long

#define maxn 1000005

#define lowbit(x) (((-x) & (x)))

using namespace std;

inline ll read()

while(s >= '0' && s <= '9')

return x * f;

}ll n,m,i,j,s,o,k,cnt;

ll a[maxn],b[maxn];

ll c[maxn];

ll f[maxn];

priority_queueq;

void addtree(int x,ll y)

inline ll sum(int x)

inline ll check(ll a)

return ans;

}ll solve(ll l,ll r)

ll mid = (l + r) / 2;

if(check(mid) <= m) return solve(mid,r);

return solve(l,mid);

}int main()

// for(int i = 1;i <= n;i ++) printf("s:%d ",sum(i));putchar('\n');

ll aa = solve(0,n);

m -= check(aa);

for(int i = 1;i <= n;i ++)

else

} for(int i = n;i > 0;i --)

}// for(int i = 1;i <= n;i ++) putchar('\n');

// printf("%d\n",m);

for(int i = 1;i < n;i ++)

} if(m > 0)

else putchar('\n');

} return 0;

}

Jzoj3542 氣泡排序

下面是一段實現氣泡排序演算法的c for int i 1 i n i for int j 1 j n i j if a j a j 1 swap a j a j 1 其中待排序的a陣列是乙個1 n的排列,swap函式將交換陣列中對應位置的值。對於給定的陣列a以及給定的非負整數k,使用這段 執行了正好...

jzoj5931 氣泡排序

氣泡排序的交換次數被定義為交換過程的執行次數。小 s 開始專注於研究 度為 n 的排列,他想知道,在你運氣足夠好的情況下 即每次氣泡排序的交換次數都是可能的最少交換次數,彷彿有上帝之手在操控 對於乙個等概率隨機的長度為n 的排列,進行這樣的氣泡排序的期望交換次數是多少?ion的梗玩到現在真是 一開始...

氣泡排序 排序 氣泡排序

既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...