51nod 1364 最大字典序排列

2021-08-16 10:59:10 字數 1143 閱讀 7469

給出乙個1至n的排列,允許你做不超過k次操作,每次操作可以將相鄰的兩個數交換,問能夠得到的字典序最大的排列是什麼?

例如:n = 5, ,k = 6,在6次交換後,能夠得到的字典序最大的排列為。

input

第1行:2個數n, k中間用空格分隔(1 <= n <= 100000, 0 <= k <= 10^9)。

第2至n + 1行:每行乙個數i(1 <= i <= n)。

output

輸出共n行,每行1個數,對應字典序最大的排列的元素。
input示例

5 612

345

output示例

531

24

思路:

貪心演算法,從n到1,考慮將每個值盡量前移。用樹狀陣列記錄每個值前移需要的步數。

#include #include using namespace std;

const int maxn = 1e5 + 5;

int n;

int a[maxn];

int output[maxn];

int pos[maxn];

int tree[maxn];

int lowbit(int x)

int sum(int x)

return result;}

void add(int i, int v)}

int main()

int tot = 1;

for (int v = n; v >= 1; v--)

if (k <= 0)

int step = sum(pos[v]) - 1;

if (step > k)

k -= step;

output[tot++] = v;

a[pos[v]] = 0;

add(pos[v], -1);

if (step == 0)

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

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

return 0;

}

51nod1364 最大字典序排列

給出乙個1至n的排列,允許你做不超過k次操作,每次操作可以將相鄰的兩個數交換,問能夠得到的字典序最大的排列是什麼?例如 n 5,k 6,在6次交換後,能夠得到的字典序最大的排列為。input 第1行 2個數n,k中間用空格分隔 1 n 100000,0 k 10 9 第2至n 1行 每行乙個數i 1...

51nod 1364 最大字典序排列

online judge 51nod 1364 label 線段樹,樹狀陣列,二分 根據題意很容易想到60 資料的 o n 2logn 暴力做法,即每次從大數往小數找,如果它能在m步內換到當前位置就把它換到前面去,然後再把選中的位置設為0,可以用樹狀陣列在 o logn 完成。cin n for i...

51nod 1364 最大字典序排列 線段樹

原題鏈結 1364 最大字典序排列 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個1至n的排列,允許你做不超過k次操作,每次操作可以將相鄰的兩個數交換,問能夠得到的字典序最大的排列是什麼?例如 n 5,k 6,在6次交換後,能夠得到的字典序最大的排列為。...