下面是一段實現氣泡排序演算法的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
這是道結論題,
在嘗試了各種方法之後,我們嘗試直接構造答案陣列。那麼,如果我們知道k次交換後一共完整地進行了x輪的話,就可以把「考慮每個數在答案陣列裡的位置。
定義j掃一遍為一輪。
分析發現:
1:每個數,每輪最多向左移動乙個位置。
繼續:2:若乙個數左邊有比它大的數,它就一定會左移乙個位置。
2逆:若它左移乙個位置,則它的左邊一定有數比它大。
再繼續:
3:設前面有t個數比它大,那麼前t輪,每一輪它都會向左移乙個位置,然後它就再不左移。
思路似乎已經清晰。
設經過x輪移動,在過不到一輪就交換k次。
先來考慮經過剛好x輪移動的情況。
如果t<=x,那麼它的位置在**?
這種情況就是,乙個數左移到一半就停止不移動了。
顯然它的位置是可求的。
如果t>x,那麼它的位置又在**?
這種數不會再左移,也就說明它的左邊沒有比它大的數。
推出結論:
4:這部分數的位置一定是隨著值而遞增的。
我們現在已經知道一部分數的具體位置了,把剩下的數按從小到大的順序填到空位置裡就好了。
現在已經知道了x輪移動的答案,還剩下一點交換次數,就直接來一輪氣泡排序就好了。
5:發現:交換次數=左移次數。
根據結論2的逆結論,統計每一輪的左移次數就好了。
- by 我們都是星塵
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,底部理解為...