题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018

巧妙的线段树。维护矩阵四个角的连通性。

  考虑两个点连通的可能路径分成3部分:两点左边、两点中间、两点右边;

  就拿中间部分来说,需要这个矩阵的四个角的连通性。所以就用线段树维护一下。

注意不要写得冗余了。比如同一块的左上到右下已经考虑过自己的左上到左下+左下到右下,更新别的块的时候不用再讨论第二种情况了。

还要注意不要搞混 r 和 c 。

(结构体真好用……)(u:lu-ru d:ld-rd U:mu D:md p:ld-ru q:lu-rd l:lu-ld r:ru-rd)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=1e5+;
  6. int n,tot=,r1,c1,r2,c2;
  7. bool b[N<<][];//1:lu-ru 2:ld-rd 3:lu-rd 4:ld-ru 5:lu-ld 6:ru-rd 7:mu-mu 8:md-md
  8. struct Node{
  9. int ls,rs;
  10. }a[N<<];
  11. struct Lt{bool l,r,u,d,U,D,p,q;}w[N<<];
  12. void build(int l,int r,int cr)
  13. {
  14. if(l==r)
  15. {
  16. // b[cr][1]=1;b[cr][2]=1;
  17. w[cr].u=w[cr].d=w[cr].U=w[cr].D=;
  18. return;
  19. }
  20. int mid=((l+r)>>);
  21. a[cr].ls=++tot;build(l,mid,tot);
  22. a[cr].rs=++tot;build(mid+,r,tot);
  23. }
  24. //void pushup(int cr)
  25. //{
  26. // int ls=a[cr].ls,rs=a[cr].rs;
  27. // if(b[ls][5]||(b[ls][1]&&b[cr][7]&&b[rs][5]&&b[cr][8]&&b[ls][2]))b[cr][5]=1;else b[cr][5]=0;
  28. // if(b[rs][6]||(b[rs][1]&&b[cr][7]&&b[ls][6]&&b[cr][8]&&b[rs][2]))b[cr][6]=1;else b[cr][6]=0;
  29. // if(b[cr][7])
  30. // {
  31. // if((b[ls][1]||(b[ls][5]&&b[ls][4]))&&(b[rs][1]||(b[rs][3]&&b[rs][6])))b[cr][1]=1;else b[cr][1]=0;
  32. // if((b[ls][4]||(b[ls][5]&&b[ls][1]))&&(b[rs][3]||(b[rs][1]&&b[rs][6])))b[cr][2]=1;else b[cr][2]=0;
  33. // if(b[ls][1]&&b[rs][3])b[cr][3]=1;else b[cr][3]=0;
  34. // if(b[ls][4]&&b[rs][1])b[cr][4]=1;else b[cr][4]=0;
  35. // }
  36. // if(b[cr][8])
  37. // {
  38. // if((b[ls][2]||(b[ls][5]&&b[ls][3]))&&(b[rs][2]||(b[rs][4]&&b[rs][6])))b[cr][2]=1;
  39. // if((b[ls][3]||(b[ls][5]&&b[ls][2]))&&(b[rs][4]||(b[rs][2]&&b[rs][4])))b[cr][1]=1;
  40. // if(b[ls][2]&&b[rs][4])b[cr][4]=1;if(b[ls][3]&&b[rs][2])b[cr][3]=1;
  41. // }
  42. //}
  43. void pushup(Lt &k,Lt x,Lt y)// &!!!!!
  44. {
  45. k.l=x.l|(x.u & k.U & y.l & k.D & x.d);
  46. k.r=y.r|(y.u & k.U & x.r & k.D & y.d);
  47. k.u=(x.u & k.U & y.u)|(x.q & k.D & y.p);
  48. k.d=(x.d & k.D & y.d)|(x.p & k.U & y.q);
  49. k.p=(x.d & k.D & y.p)|(x.p & k.U & y.u);
  50. k.q=(x.u & k.U & y.q)|(x.q & k.D & y.d);
  51. }
  52. //void mdfy(int l,int r,int cr,bool p)
  53. //{
  54. // if(l>=r1&&r<=r2)
  55. // {
  56. // if(c1!=c2){b[cr][3]=p;b[cr][4]=p;b[cr][5]=p;b[cr][6]=p;}
  57. // else if(c1==1){
  58. // b[cr][1]=p;b[cr][7]=p;
  59. // if(b[a[cr].ls][5])b[cr][4]=1;if(b[a[cr].rs][5])b[cr][3]=1;
  60. // }
  61. // else {
  62. // b[cr][2]=p;b[cr][8]=p;
  63. // if(b[a[cr].ls][5])b[cr][3]=1;if(b[a[cr].rs][5])b[cr][4]=1;
  64. // }
  65. // return;
  66. // }
  67. // int mid=l+r>>1;
  68. // if(mid>=r2)mdfy(l,mid,a[cr].ls,p);
  69. // else if(mid<r1)mdfy(mid+1,r,a[cr].rs,p);
  70. // else b[cr][c1==1?7:8]=1;
  71. // pushup(cr,a[cr].ls,a[cr].rs);
  72. //}
  73. void mdfyr(int l,int r,int cr,bool f)
  74. {
  75. int mid=((l+r)>>);
  76. if(mid==c1)
  77. {
  78. if(r1==)w[cr].U=f;else w[cr].D=f;
  79. pushup(w[cr],w[a[cr].ls],w[a[cr].rs]);return;//pushup
  80. }
  81. if(c1<mid)mdfyr(l,mid,a[cr].ls,f);
  82. else mdfyr(mid+,r,a[cr].rs,f);
  83. pushup(w[cr],w[a[cr].ls],w[a[cr].rs]);
  84. }
  85. void mdfyc(int l,int r,int cr,bool f)
  86. {
  87. if(l==r)
  88. {
  89. w[cr].l=w[cr].r=w[cr].p=w[cr].q=f;return;
  90. }
  91. int mid=((l+r)>>);
  92. if(mid>=c1)mdfyc(l,mid,a[cr].ls,f);
  93. else mdfyc(mid+,r,a[cr].rs,f);
  94. pushup(w[cr],w[a[cr].ls],w[a[cr].rs]);
  95. }
  96. //bool query(int l,int r,int cr,int r1,int c1,int r2,int c2)
  97. //{
  98. // if(l==r1&&r==r2)
  99. // {
  100. // if(c1==1&&c2==1)return b[cr][1];
  101. // if(c1==1&&c2==2)return b[cr][3];
  102. // if(c1==2&&c2==1)return b[cr][4];
  103. // if(c1==2&&c2==2)return b[cr][2];
  104. // }
  105. // int mid=l+r>>1,ls=a[cr].ls,rs=a[cr].rs;
  106. // if(mid>=r2)return query(l,mid,ls,r1,c1,r2,c2);
  107. // else if(mid<r1)return query(mid+1,r,rs,r1,c1,r2,c2);
  108. // else return ((b[cr][7]&&query(l,mid,ls,r1,c1,mid,1)&&query(mid+1,r,rs,mid,1,r2,c2))
  109. // ||(b[cr][8]&&query(l,mid,ls,r1,c1,mid,2)&&query(mid+1,r,rs,mid,2,r2,c2)));
  110. //}
  111. //bool query(int l,int r,int cr,int r1,int c1,int r2,int c2)
  112. //{
  113. //// printf("l=%d r=%d r1=%d c1=%d r2=%d c2=%d\n",l,r,r1,c1,r2,c2);
  114. // if(l==c1&&r==c2)
  115. // {
  116. // if(r1==r2){if(r1==1)return w[cr].u;else return w[cr].d;}
  117. // else {if(r1==1)return w[cr].q;else return w[cr].p;}
  118. // }
  119. // int mid=l+r>>1,ls=a[cr].ls,rs=a[cr].rs;
  120. // if(mid>=c2)return query(l,mid,ls,r1,c1,r2,c2);
  121. // else if(mid<c1)return query(mid+1,r,rs,r1,c1,r2,c2);
  122. // else return (w[cr].U&query(l,mid,ls,r1,c1,mid,1)&query(mid+1,r,rs,mid+1,1,r2,c2))
  123. // |(w[cr].D&query(l,mid,ls,r1,c1,mid,2)&query(mid+1,r,rs,mid+1,2,r2,c2));
  124. //}
  125. Lt query(int l,int r,int cr,int L,int R)
  126. {
  127. if(l>=L&&r<=R)return w[cr];
  128. int mid=((l+r)>>),ls=a[cr].ls,rs=a[cr].rs;
  129. if(mid>=R)return query(l,mid,ls,L,R);
  130. else if(mid<L)return query(mid+,r,rs,L,R);
  131. else{
  132. Lt ret=w[cr];
  133. pushup(ret,query(l,mid,ls,L,R),query(mid+,r,rs,L,R));
  134. return ret;
  135. }
  136. }
  137. int main()
  138. {
  139. scanf("%d",&n);char ch[];
  140. build(,n,);
  141. while()
  142. {
  143. scanf("%s",ch);if(ch[]=='E')return ;
  144. scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
  145. if(c1>c2)swap(r1,r2),swap(c1,c2);
  146. if(ch[]=='O'||ch[]=='C')
  147. {
  148. if(r1==r2)mdfyr(,n,,ch[]=='O'?:);
  149. else mdfyc(,n,,ch[]=='O'?:);
  150. }
  151. if(ch[]=='A')
  152. {
  153. // if(query(1,n,1,r1,c1,r2,c2))printf("Y\n");else printf("N\n");
  154. bool flag=;
  155. Lt x=query(,n,,,c1),y=query(,n,,c1,c2),z=query(,n,,c2,n);
  156. if(r1==&&r2==)flag=y.u|(x.r & y.d & z.l)|(y.q & z.l)|(x.r & y.p);
  157. if(r2==&&r2==)flag=y.d|(x.r & y.u & z.l)|(x.r & y.q)|(y.p & z.l);
  158. if(r1==&&r2==)flag=y.q|(x.r & y.p & z.l)|(x.r & y.d)|(y.u & z.l);
  159. if(r1==&&r2==)flag=y.p|(x.r & y.q & z.l)|(x.r & y.u)|(y.d & z.l);
  160. if(flag)printf("Y\n");else printf("N\n");
  161. }
  162. }
  163. }

bzoj1018[SHOI2008]堵塞的交通traffic——线段树的更多相关文章

  1. [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3795  Solved: 1253 [Sub ...

  2. Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)

    这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...

  3. [bzoj1018][SHOI2008]堵塞的交通traffic_线段树

    bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...

  4. 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树

    [BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

  6. 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set

    题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...

  7. BZOJ1018 SHOI2008堵塞的交通(线段树)

    动态图的连通性当然是可以用LCT维护的.但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢. 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径 ...

  8. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  9. 【BZOJ1018】堵塞的交通(线段树)

    [BZOJ1018]堵塞的交通(线段树) 题面 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网 ...

随机推荐

  1. 1-12 RHEL7-find命令的使用

    1.文件查找findfind命令是在目录结构中,搜索文件,并执行特定的操作find命令提供了相当多的查找条件,功能很强大 2.格式usage:find pathname -options[-print ...

  2. canvas图形的组合与裁切

    当两个或两个以上的图形存在重叠区域时,默认情况下一个图形画在前一个图像之上.通过指定图像globalCompositeOperation属性的值可以改变图形的绘制顺序或绘制方式,globalAlpha ...

  3. ts结合vue使用的感悟

    TypeScript 前端现在越来越强大,多人开发更是常见,加上各大框架都开始支持TypeScript,而谷歌和微软又更加积极,导致不得不去学习,顺道通过js来了解ts,再通过ts来了解强类型语言.一 ...

  4. 十五、dbms_space(分析段增长和空间的需求)

    1.概述 作用:用于分析段增长和空间的需求. 2.包的组成 1).unused_space作用:用于返回对象(表.索引.簇)的未用空间语法:dbms_space.unused_space(segmen ...

  5. UITextField点击选中文字

    1.先创建UITextField - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...

  6. Linux:vim环境设置

    vim环境设置 vim的环境设置在/etc/vimrc的这个文件中,不过不建议直接修改该配置文件.但是可以修改~/.vimrc文件,默认是不存在的,要手动创建并写入设置值. set hlsearch ...

  7. Unity3D使用溶解技术解决障碍物遮挡

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  8. awk命令结合管道命令对json文件进行统计分析

    json文件内容: $ head file.json {"B": 0.337, "C": 0.663, "name": "xxx& ...

  9. oracle管道函数的用法

    oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合,下面将介绍oracle管道函数的语法. 在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数 ...

  10. 使用vue

    使用bootstrap npm install bootstrap@3 --save 使用jQuery npm install jQuery --save ---------------- 搭建vue ...