給出乙個1至n的排列,允許你做不超過k次操作,每次操作可以將相鄰的兩個數交換,問能夠得到的字典序最大的排列是什麼?
例如:n = 5, ,k = 6,在6次交換後,能夠得到的字典序最大的排列為。
input
第1行:2個數n, k中間用空格分隔(1 <= n <= 100000, 0 <= k <= 10^9)。output第2至n + 1行:每行乙個數i(1 <= i <= n)。
輸出共n行,每行1個數,對應字典序最大的排列的元素。input示例
5 612345output示例
53124
李陶冶(題目提供者)
題解:因為要求字典序最大所以很明顯我們要使每一位盡可能的大,所以我們貪心每一位所能放的最大值,用線段樹來維護當前剩餘操作步數能交換的數字中最大且最靠前的那乙個。具體看**,主要是一些細節問題。
**:
#includeusing namespace std;
struct aaaf[1000000];
int a[1000000],tt,maxk;
void pushup(int x)
else
f[x].num=f[x*2].num+f[x*2+1].num;
}void build(int x,int l,int r)
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
pushup(x);
}void updata(int x,int l,int r,int t)
int mid=(l+r)/2;
if(t<=mid)updata(x*2,l,mid,t);
else updata(x*2+1,mid+1,r,t);
pushup(x);
}int cha_num(int x,int l,int r,int t,int k)
int cha_bu(int x,int l,int r,int t)
void cha(int x,int l,int r,int t,int k)
else if(f[x].max==maxk)
return;
} int mid=(l+r)/2;
if(k<=mid)cha(x*2,l,mid,t,k);
else if(t>mid)cha(x*2+1,mid+1,r,t,k);
else
}int main()
else
} for(i=1;i<=n;i++)
if(a[i])printf("%d\n",a[i]);
}
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...
51nod 1364 最大字典序排列 線段樹
原題鏈結 1364 最大字典序排列 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個1至n的排列,允許你做不超過k次操作,每次操作可以將相鄰的兩個數交換,問能夠得到的字典序最大的排列是什麼?例如 n 5,k 6,在6次交換後,能夠得到的字典序最大的排列為。...