• [st表][贪心]Loop 2022杭电多校第6场 1012


    Problem Description

    You are given an array aa of length nn. You must perform exactly kk times operations.

    For each operation,

    \bullet∙ First, you select two integers l,rl,r ((1\leq l\leq r \leq n1≤l≤r≤n)),

    \bullet∙ Second, change aa to bb, satisfy :

    \ \ \ \ \circ    ∘ For each ii ((1\le i< l1≤i

    \ \ \ \ \circ    ∘ For each ii ((l\le i< rl≤i

    \ \ \ \ \circ    ∘ b_r=a_lbr​=al​

    \ \ \ \ \circ    ∘ For each ii ((r< i\le nr

    Find the lexicographically largest possible array after kk times operations.

    Array xx is lexicographically greater than array yy if there exists an index ii (( 1\leq i\leq n1≤i≤n )) such that x_ixi​ >> y_iyi​ and for every j (1\leq j \lt i) ,j(1≤j

    Input

    The first line of the input contains one integer TT ((1\leq T\leq 1001≤T≤100 )) --- the number of test cases. Then TT test cases follow.

    The first line of the test case contains two integers n,kn,k ((1\le n,k\le 3000001≤n,k≤300000))

    The second line of the test case contains nn integers a_1,a_2,...,a_na1​,a2​,...,an​((1\le a_i\le 3000001≤ai​≤300000))

    The sum of nn over all testcases doesn't exceed 10^{6}106.

    The sum of kk over all testcases doesn't exceed 10^{6}106.

    Output

    For each testcase,one line contains nn integers ,a_1,a_2,...,a_na1​,a2​,...,an​ --- the lexicographically largest possible array after kk times operations.

    Don‘t have spaces at the end of the line

    Sample Input

    2

    7 3

    1 4 2 1 4 2 4

    5 2

    4 3 5 4 5

    Sample Output

    4 4 2 4 2 1 1

    5 4 5 4 3

    题意: 给出长度为n的数组以及k次操作机会,每次操作可以选择一个区间[l, r]使区间内的点循环左移1位,问最终字典序最大的序列是什么。

    分析: 选择区间[l, r]内的循环左移实际上等价于选择一个值a[i]将其拿出并放在后面任意一个位置上,贪心地想,要想字典序最大那么从前往后看每个位置都要尽可能大,所以遍历一遍数组,第i个位置能够通过小于等于k次的操作变成a[i]到a[i+k]中的某个值,显然第i个位置应该变成其中的最大值,所以这需要我们提前维护出区间最大值,这可以通过st表O(nlogn)处理出来,过程中被弹出的值用一个数组t2存下来,取到的最大值也用一个数组t1存下来,最后可以将这些弹出的值任意插入回t1,所以对t2降序排列,字典序最大也就是一个类似归并t1和t2的过程。

    具体代码如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. int f[300005][20], a[300005], n, k, ans[300005];
    9. bool cmp(int x, int y){
    10. return x > y;
    11. }
    12. void st()
    13. {
    14. for(int i = 1; i <= n; i ++) f[i][0] = a[i];
    15. for(int j = 1; j < 20; j ++)
    16. for(int i = 1; i+(1<-1 <= n; i ++)
    17. f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]);//均分为两部分
    18. }
    19. int query(int l, int r)
    20. {
    21. int len = abs(r-l+1);//询问区间长度
    22. int t = log(len)/log(2);//换底公式,得到以2为底的下取整对数
    23. return max(f[l][t],f[r-(1<1][t]);
    24. }
    25. signed main()
    26. {
    27. int T;
    28. cin >> T;
    29. while(T--){
    30. scanf("%d%d", &n, &k);
    31. for(int i = 1; i <= n; i++)
    32. scanf("%d", &a[i]);
    33. st();
    34. vector<int> temp1, temp2;
    35. for(int i = 1; i <= n; i++){
    36. int l = i, r = i+k;
    37. if(r > n) r = n;
    38. int mx = query(l, r);
    39. temp1.push_back(mx);
    40. while(a[i] != mx){
    41. if(!k) break;
    42. k--;
    43. temp2.push_back(a[i]);
    44. i++;
    45. }
    46. }
    47. sort(temp2.begin(), temp2.end(), cmp);
    48. int cnt = 0, i = 0, j = 0;
    49. for(; i < temp1.size() && j < temp2.size();){
    50. if(temp1[i] < temp2[j]){
    51. ans[++cnt] = temp2[j];
    52. j++;
    53. }
    54. else if(temp1[i] >= temp2[j]){
    55. ans[++cnt] = temp1[i];
    56. i++;
    57. }
    58. }
    59. while(i < temp1.size()){
    60. ans[++cnt] = temp1[i];
    61. ++i;
    62. }
    63. while(j < temp2.size()){
    64. ans[++cnt] = temp2[j];
    65. ++j;
    66. }
    67. printf("%d", ans[1]);
    68. for(int i = 2; i <= n; i++)
    69. printf(" %d", ans[i]);
    70. puts("");
    71. }
    72. return 0;
    73. }

  • 相关阅读:
    HTML+CSS+JS网页设计期末课程大作业—— 绿色化妆品HTML+CSS+JavaScript
    一文说清如何使用keepalive实现页面缓存-(已上线)
    跨境电商独立站海外引流渠道:Quora运营技巧
    android接入微信API相关细节
    java学习day7(Java基础)方法和封装
    手机端实现触摸拖拽效果
    【计算机图形学入门】笔记2:向量与线性代数(图形学中用到的线性代数)
    系统架构设计师【第10章】: 软件架构的演化和维护 (核心总结)
    golang学习笔记——查找质数
    docker笔记7:Docker微服务实战
  • 原文地址:https://blog.csdn.net/m0_55982600/article/details/126166866