給出乙個1至n的排列,允許你做不超過k次操作,每次操作可以將相鄰的兩個數交換,問能夠得到的字典序最大的排列是什麼?
例如:n = 5, ,k = 6,在6次交換後,能夠得到的字典序最大的排列為。
input
output第1行:2個數n, k中間用空格分隔(1 <= n <= 100000, 0 <= k <= 10^9)。
第2至n + 1行:每行乙個數i(1 <= i <= n)。
輸出共n行,每行1個數,對應字典序最大的排列的元素。
input示例
output示例5 612
345
思路: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次交換後,能夠得到的字典序最大的排列為。...