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

2021-07-24 09:00:56 字數 2255 閱讀 3514

原題鏈結

1364 最大字典序排列

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

給出乙個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 612345

output示例

531

24

維護兩個線段樹num, cnt, 在num中[l, r]表示該區間元素的最大值,cnt中[l, r]表示區間裡有多少個元素

每次根據k, n算出最遠的乙個元素j(通過相鄰位置的交換能到最前面), 根據cnt線段樹查詢第j個元素的值,求出下標r, 在根據num線段樹求出[1, r]中的最大值,直接輸出最大值,把最大值的位置在num和cnt中賦值為0,相當於沒有這個位置,迴圈操作

#include #define maxn 100005

#define mod 1000000007

using namespace std;

typedef long long ll;

int num[maxn<<2], cnt, kk[maxn<<2], p[maxn], vis[maxn];

void build(int j, int l, int r)

int mid = (l + r) >> 1;

build(j<<1, l, mid);

build(j<<1|1, mid+1, r);

num[j] = max(num[j<<1], num[j<<1|1]);

kk[j] = kk[j<<1] + kk[j<<1|1];

}int query(int j, int l, int r, int l, int r)

int mid = (l + r) >> 1;

if(r <= mid)

return query(j<<1, l, mid, l, r);

if(l > mid)

return query(j<<1|1, mid+1, r, l, r);

return max(query(j<<1, l, mid, l, mid), query(j<<1|1, mid+1, r, mid+1, r));

}void update(int j, int l, int r, int e)

int mid = (l + r) >> 1;

if(mid >= e)

update(j<<1, l, mid, e);

else

update(j<<1|1, mid+1, r, e);

num[j] = max(num[j<<1], num[j<<1|1]);

kk[j] = kk[j<<1] + kk[j<<1|1];

}int query2(int j, int l, int r, int c)

int mid = (l + r) >> 1;

if(kk[j<<1] >= c)

return query2(j<<1, l, mid, c);

return query2(j<<1|1, mid+1, r, c-kk[j<<1]);

}int query3(int j, int l, int r, int l, int r)

int mid = (l + r) >> 1;

if(r <= mid)

return query3(j<<1, l, mid, l, r);

if(l > mid)

return query3(j<<1|1, mid+1, r, l, r);

return query3(j<<1, l, mid, l, mid) + query3(j<<1|1, mid+1, r, mid+1, r);

}int main()

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

if(p[i])

printf("%d\n", p[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 最大字典序排列

給出乙個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...