【UOJ25】【IOI2014】Wall

线段树即可。

We need to build a wall!(雾)

标记: (l,r) 表示将小于 l 的数变为 l ,大于 r 的数变为 r ,其余的数不变。显然对 x min就是 (0,x) ,对 x max就是 (x,INF)

(l1,r1)+(l2,r2) = \begin{cases} (l2,l2), & \text{if $r1<l2$} \\ (r2,r2), & \text{if $r2<l1$} \\ (\max(l1,l2),\min(r1,r2)), & \text{otherwise} \\ \end{cases}

其中 (l1,r1) 先执行, (l2,r2) 后执行。

直接上线段树,最后dfs一遍算出答案即可。

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int INF=100000;
  4. struct tag{
  5. int l,r;
  6. tag():l(0),r(INF){}
  7. tag(int x):l(x),r(x){}
  8. tag(int l,int r):l(l),r(r){}
  9. tag operator +(const tag& rhs)const{
  10. if (r<rhs.l)
  11. return rhs.l;
  12. if (rhs.r<l)
  13. return rhs.r;
  14. return tag(max(l,rhs.l),min(r,rhs.r));
  15. }
  16. tag& operator +=(const tag& rhs){
  17. return *this=*this+rhs;
  18. }
  19. };
  20. const int maxn=2000001;
  21. struct segtree{
  22. int n;
  23. tag tagv[maxn*4];
  24. void build(int o,int l,int r){
  25. if (l==r){
  26. tagv[o]=0;
  27. return;
  28. }
  29. int mid=(l+r)/2;
  30. build(o*2,l,mid);
  31. build(o*2+1,mid+1,r);
  32. }
  33. void init(int n){
  34. this->n=n;
  35. build(1,0,n-1);
  36. }
  37. void pushdown(int o){
  38. tagv[o*2]+=tagv[o];
  39. tagv[o*2+1]+=tagv[o];
  40. tagv[o]=tag();
  41. }
  42. int ul,ur;
  43. tag v;
  44. void update(int o,int l,int r){
  45. if (ul<=l && ur>=r){
  46. tagv[o]+=v;
  47. return;
  48. }
  49. int mid=(l+r)/2;
  50. pushdown(o);
  51. if (ul<=mid)
  52. update(o*2,l,mid);
  53. if (ur>mid)
  54. update(o*2+1,mid+1,r);
  55. }
  56. void update(int op,int l,int r,int h){
  57. ul=l,ur=r;
  58. v=op==1?tag(h,INF):tag(0,h);
  59. update(1,0,n-1);
  60. }
  61. int* ans;
  62. void dfs(int o,int l,int r,tag t=tag()){
  63. if (l==r){
  64. ans[l]=(tagv[o]+t).l;
  65. return;
  66. }
  67. int mid=(l+r)/2;
  68. tag w=tagv[o]+t;
  69. dfs(o*2,l,mid,w);
  70. dfs(o*2+1,mid+1,r,w);
  71. }
  72. void query(int *ans){
  73. this->ans=ans;
  74. dfs(1,0,n-1);
  75. }
  76. }t;
  77. void buildWall(int n,int m,int *op,int *l,int *r,int *h,int *ans){
  78. t.init(n);
  79. for(int i=0;i<m;i++)
  80. t.update(op[i],l[i],r[i],h[i]);
  81. t.query(ans);
  82. }

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

本文链接:https://www.q234rty.top/2017/03/28/uoj25/

隐藏