Codeforces Round #504 D. Array Restoration

题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部改为\(i\),序列\(a\)的每个位置至少被改一次。得到最终的序列,然后将序列里的某些位置变成\(0\),输出一种可能的置零之前的最终序列,或无解。

solution

求出每种数字最长的染色区间,按这个区间染色,记下没出现的数字。染色后如果存在\(0\)联通块,则用没出现的数字从大到小染色(一个联通块一种颜色),不够则无解,最后判断最大的数字\(q\)是否用上了,如果没有,则在原序列中找一个\(0\)变成\(q\)即可,若原序列没有\(0\),则无解。

时间复杂度:\(O(nlogn)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=int(2e5)+100;
  4. struct mes
  5. {
  6. int x, y, v;
  7. };
  8. int n, m;
  9. int a[maxn], ans[maxn];
  10. int BIT[maxn];
  11. int tree[maxn*4], mark[maxn*4];
  12. bool vis[maxn];
  13. vector<int> zero;
  14. pair<int, int> block[maxn];
  15. mes dat;
  16. void read()
  17. {
  18. scanf("%d%d", &n, &m);
  19. for (int i=1; i<=n; ++i) scanf("%d", &a[i]);
  20. }
  21. void insert(int cur, int v)
  22. {
  23. for (; cur<=m; cur+=(-cur)&cur) BIT[cur]=max(BIT[cur], v);
  24. }
  25. int ask(int cur)
  26. {
  27. int w=0;
  28. for (; cur; cur-=(-cur)&cur) w=max(w, BIT[cur]);
  29. return w;
  30. }
  31. void down(int cur)
  32. {
  33. tree[cur<<1]=tree[cur<<1 | 1]=mark[cur];
  34. mark[cur<<1]=mark[cur<<1 | 1]=mark[cur];
  35. mark[cur]=0;
  36. }
  37. void updata(int cur, int L, int R)
  38. {
  39. if (dat.x>R || dat.y<L) return;
  40. if (dat.x<=L && R<=dat.y)
  41. {
  42. tree[cur]=dat.v;
  43. mark[cur]=dat.v;
  44. return;
  45. }
  46. int mid=(L+R)>>1;
  47. if (mark[cur]) down(cur);
  48. updata(cur<<1, L, mid);
  49. updata(cur<<1 | 1, mid+1, R);
  50. }
  51. int get(int cur, int L, int R)
  52. {
  53. if (L==R) return tree[cur];
  54. int mid=(L+R)>>1;
  55. if (mark[cur]) down(cur);
  56. if (dat.x<=mid) return get(cur<<1, L, mid);
  57. else return get(cur<<1 | 1, mid+1, R);
  58. }
  59. void solve()
  60. {
  61. for (int i=1; i<=n; ++i)
  62. {
  63. if (a[i]==0) continue;
  64. if (!vis[a[i]]) block[a[i]].first=ask(a[i]-1);
  65. vis[a[i]]=true;
  66. insert(a[i], i);
  67. }
  68. for (int i=1; i<=m; ++i) BIT[i]=0, vis[i]=false;
  69. for (int i=n; i; --i)
  70. {
  71. if (a[i]==0) continue;
  72. if (!vis[a[i]]) block[a[i]].second=n-ask(a[i]-1)+1;
  73. vis[a[i]]=true;
  74. insert(a[i], n-i+1);
  75. }
  76. for (int i=1; i<=m; ++i)
  77. if (!vis[i]) zero.push_back(i);
  78. else
  79. {
  80. dat.x=block[i].first+1;
  81. dat.y=block[i].second-1;
  82. dat.v=i;
  83. updata(1, 1, n);
  84. }
  85. for (int i=1; i<=n; ++i)
  86. {
  87. dat.x=dat.y=i;
  88. ans[i]=get(1, 1, n);
  89. }
  90. for (int i=1; i<=n; ++i)
  91. if (a[i]!=0 && a[i]!=ans[i])
  92. {
  93. printf("NO\n");
  94. return;
  95. }
  96. for (int i=1; i<=n; )
  97. {
  98. if (ans[i]!=0) { ++i; continue; }
  99. if (zero.size()==0)
  100. {
  101. puts("NO");
  102. return;
  103. }
  104. int j=i;
  105. while (j<=n && a[j]==0) ++j;
  106. for (int k=i; k<j; ++k) ans[k]=zero.back();
  107. zero.pop_back();
  108. i=j;
  109. }
  110. if (!zero.empty() && zero.back()==m)
  111. {
  112. int idx=0;
  113. for (int i=1; i<=n; ++i)
  114. if (a[i]==0)
  115. {
  116. idx=i;
  117. break;
  118. }
  119. if (idx==0)
  120. {
  121. puts("NO");
  122. return;
  123. }
  124. ans[idx]=m;
  125. }
  126. puts("YES");
  127. for (int i=1; i<=n; ++i) printf("%d ", ans[i]);
  128. }
  129. int main()
  130. {
  131. read();
  132. solve();
  133. return 0;
  134. }

Codeforces Round #504 D. Array Restoration的更多相关文章

  1. Codeforces Round #504 E. Down or Right

    Codeforces Round #504 E. Down or Right 题目描述:交互题. 有一个\(n \times n\)的方阵,有一些格子是障碍,从\((1, 1)\)出发,只能向右向下走 ...

  2. Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...

  3. Codeforces Round #504:D. Array Restoration

    D. Array Restoration 题目链接:https://codeforces.com/contest/1023/problem/D 题意: 给出一个序列,现在要求对一个全为0的序列执行q次 ...

  4. Codeforces 1023 D.Array Restoration-RMQ(ST)区间查询最值 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    D. Array Restoration 这题想一下就会发现是只要两个相同的数之间没有比它小的就可以,就是保存一下数第一次出现和最后一次出现的位置,然后查询一下这个区间就可以,如果有0的话就进行填充. ...

  5. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-D- Array Restoration

    我们知道不满足的肯定是两边大中间小的,这样就用RMQ查询两个相同等值的区间内部最小值即可,注意边界条件 #include<bits/stdc++.h> #define x first #d ...

  6. Educational Codeforces Round 21 D.Array Division(二分)

    D. Array Division time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  7. Educational Codeforces Round 11A. Co-prime Array 数学

    地址:http://codeforces.com/contest/660/problem/A 题目: A. Co-prime Array time limit per test 1 second me ...

  8. E - Down or Right Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

    http://codeforces.com/contest/1023/problem/E 交互题 #include <cstdio> #include <cstdlib> #i ...

  9. Educational Codeforces Round 52D(ARRAY,模拟最短路)

    #include<bits/stdc++.h>using namespace std;int n,x;int chess[17*17];//记录棋盘上的numberarray<int ...

随机推荐

  1. How Many Points? LightOJ - 1077(线段经过整点个数与gcd 证明)

    题意: 已知两点 (x1,y1) 和 (x2, y2)求两点间线段上的整点的个数 解析: 就是求gcd(abs(x2- x1),abs(y2 - y1)) 证明: 我们分水平方向和竖直方向两个方向看 ...

  2. BZOJ 2251: [2010Beijing Wc]外星联络

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 795  Solved: 477[Submit][ ...

  3. 【BZOJ1922】大陆争霸(最短路)

    [BZOJ1922]大陆争霸(最短路) 题面 BZOJ 洛谷 题解 最短路变形题. 定义\(dis\)表示最短路,\(d\)表示最早可以进入当前点的时间.显然\(d=max(max(dis_v,d_v ...

  4. wazuh安装手册

    一.wazhu部署架构 1.服务器上运行的Agent端会将采集到的各种信息通过加密信道传输到管理端. 2.管理端负责分析从代理接收的数据,并在事件与告警规则匹配时触发警报. 3.LogStash会将告 ...

  5. Android Studio & eclipse 调试技巧

    如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...

  6. BUG1 解决java compiler level does not match the version of the installed java project facet

    因工作的关系,Eclipse开发的Java项目拷来拷去,有时候会报一个很奇怪的错误.明明源码一模一样,为什么项目复制到另一台机器上,就会报“java compiler level does not m ...

  7. sql 事务的四种隔离级别

    在 SQL 标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. read unco ...

  8. 简单易懂的GBDT

    转https://www.cnblogs.com/liuyu124/p/7333080.html 梯度提升决策树(Gradient Boosting Decision Tree,GBDT)算法是近年来 ...

  9. NO.7day系统监控,硬盘分区和文件系统管理

    系统监控,硬盘分区和文件系统管理 1.系统监控 top命令:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.默认每5秒刷新屏幕数 ...

  10. ElasticStack系列之十一 & 同步 mysql 数据的实践与思考

    问题 1. jdbc-input-plugin 只能实现数据库的追加,对于 elasticsearch 增量写入,但经常 jdbc 源一端的数据库可能会做数据库删除或者更新操作.这样一来数据库与搜索引 ...