【题解】

  原来线段树还可以这么玩。。

  我们用线段树维护连通性。对于一个矩形,我们用4个标记维护4个点的联通情况,再用两个标记维护右边两个点与它们右边的与它们在同一行的点的联通情况。

  画图表示,就是

    

  另一个关键问题是对于询问(r1,c1,r2,c2),并不是只可以走c1到c2之间的部分,它可以绕路走,这就需要我们在处理询问的时候把c1,c2进行扩展。具体说来,就是让c1一直向左走,让c2一直向右走,

然后查询新的(r1,c1,r2,c2). 为什么这样做是对的呢?

  

  

  通过上图我们可以发现要绕路走必须走到跟r1,r2不同的行,也就是一定会通过c1左边的竖着的边以及c2右边的竖着的边。而且一定存在一种走法使得绕路走的部分形成一个类似括号的形状。我们把c1一直左移得到c1',就可以保证[c1',c1]之间一定有竖着的边(如果c1到c1左边联通的部分之间有竖边存在的话)。右边的c2也是同理。这样查询新的c1,c2就转化成了没有绕路走的情况。

  1. // luogu-judger-enable-o2
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N 100010
  5. #define rg register
  6. #define ls (u<<1)
  7. #define rs (u<<1|1)
  8. using namespace std;
  9. int n;
  10. struct tree{
  11. int t1,t2,t3,t4,t5,t6;
  12. }a[N<<];
  13. inline int read(){
  14. int k=,f=; char c=getchar();
  15. while(c<''||c>'')c=='-'&&(f=-),c=getchar();
  16. while(''<=c&&c<='')k=k*+c-'',c=getchar();
  17. return k*f;
  18. }
  19. inline void pushup(int u){
  20. a[u].t1=(a[ls].t1&&a[ls].t5&&a[rs].t1)||(a[ls].t3&&a[ls].t6&&a[rs].t4);
  21. a[u].t2=(a[ls].t2&&a[ls].t6&&a[rs].t2)||(a[ls].t4&&a[ls].t5&&a[rs].t3);
  22. a[u].t3=(a[ls].t1&&a[ls].t5&&a[rs].t3)||(a[ls].t3&&a[ls].t6&&a[rs].t2);
  23. a[u].t4=(a[ls].t4&&a[ls].t5&&a[rs].t1)||(a[ls].t2&&a[ls].t6&&a[rs].t4);
  24. a[u].t5=a[rs].t5;
  25. a[u].t6=a[rs].t6;
  26. }
  27. void build(int u,int l,int r){
  28. if(l<r){
  29. int mid=(l+r)>>;
  30. build(ls,l,mid); build(rs,mid+,r);
  31. }
  32. else a[u].t1=a[u].t2=;
  33. }
  34. void update(int u,int l,int r,int pos,int type,int del){
  35. if(l==r){
  36. if(type==||type==) a[u].t3=a[u].t4=del;
  37. if(type==) a[u].t5=del;
  38. if(type==) a[u].t6=del;
  39. return;
  40. }
  41. int mid=(l+r)>>;
  42. if(pos<=mid) update(ls,l,mid,pos,type,del);
  43. else update(rs,mid+,r,pos,type,del);
  44. pushup(u);
  45. }
  46. tree query(int u,int l,int r,int ql,int qr){
  47. if(ql<=l&&r<=qr) return a[u];
  48. tree ret,L,R; int mid=(l+r)>>;
  49. L=R=(tree){,,,,,};
  50. if(ql<=mid) ret=L=query(ls,l,mid,ql,qr);
  51. if(qr>mid) ret=R=query(rs,mid+,r,ql,qr);
  52. if(ql<=mid&&qr>mid){
  53. ret.t1=(L.t1&&L.t5&&R.t1)||(L.t3&&L.t6&&R.t4);
  54. ret.t2=(L.t2&&L.t6&&R.t2)||(L.t4&&L.t5&&R.t3);
  55. ret.t3=(L.t1&&L.t5&&R.t3)||(L.t3&&L.t6&&R.t2);
  56. ret.t4=(L.t4&&L.t5&&R.t1)||(L.t2&&L.t6&&R.t4);
  57. }
  58. return ret;
  59. }
  60. int goleft(int u,int l,int r,int type,int pos){
  61. if(r==pos&&((type==&&a[u].t1)||(type==&&a[u].t2))) return l;
  62. int mid=(l+r)>>;
  63. if(pos<=mid) return goleft(ls,l,mid,type,pos);
  64. int L=goleft(rs,mid+,r,type,pos);
  65. if(L==mid+&&((type==&&a[ls].t5)||(type==&&a[ls].t6)))
  66. return goleft(ls,l,mid,type,mid);
  67. return L;
  68. }
  69. int goright(int u,int l,int r,int type,int pos){
  70. if(l==pos&&((type==&&a[u].t1)||(type==&&a[u].t2))) return r;
  71. int mid=(l+r)>>;
  72. if(pos>mid) return goright(rs,mid+,r,type,pos);
  73. int R=goright(ls,l,mid,type,pos);
  74. if(R==mid&&((type==&&a[ls].t5)||(type==&&a[ls].t6)))
  75. return goright(rs,mid+,r,type,mid+);
  76. return R;
  77. }
  78. int main(){
  79. n=read(); build(,,n);
  80. while(){
  81. char s[]; scanf("%s",s+);
  82. while(s[]!='E'&&s[]!='C'&&s[]!='O'&&s[]!='A') scanf("%s",s+);
  83. if(s[]=='E') break;
  84. int r1=read(),c1=read(),r2=read(),c2=read();
  85. if(c1>c2) swap(c1,c2),swap(r1,r2);
  86. if(s[]=='C'){
  87. if(c1==c2) update(,,n,c1,,);
  88. if(r1==r2) update(,,n,c1,r1==?:,);
  89. }
  90. if(s[]=='O'){
  91. if(c1==c2) update(,,n,c1,,);
  92. if(r1==r2) update(,,n,c1,r1==?:,);
  93. }
  94. if(s[]=='A'){
  95. c1=goleft(,,n,r1,c1); c2=goright(,,n,r2,c2);
  96. tree ans=query(,,n,c1,c2);
  97. bool flag=;
  98. if(r1==&&r2==) flag=ans.t1;
  99. if(r1==&&r2==) flag=ans.t2;
  100. if(r1==&&r2==) flag=ans.t3;
  101. if(r1==&&r2==) flag=ans.t4;
  102. puts(flag?"Y":"N");
  103. }
  104. }
  105. return ;
  106. }

洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通的更多相关文章

  1. 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Descri ...

  2. BZOJ 1018 [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2247  Solved: 706[Submit ...

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

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

  4. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...

  6. BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)

    题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...

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

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

  8. 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...

  9. 【BZOJ】1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...

随机推荐

  1. ECS服务器配置密钥登录及常用日志

    一.介绍 1.SSH(22端口)是Secure Shell Protocol的简写,由IETF网络工作小组(Network Working Group)制定:在进行数据传输之前,SSH先对联机数据包通 ...

  2. 关于js-cookie使用出现兼容性问题以及js-cookie的如何使用

    最近使用vue开发的项目,开发过程引入了js-cookie插件,在PC端以及移动端网页调试都没出现问题,但是打包成APP在安卓手机调试发现使用js-cookie保存的数据失效了,然后只能使用local ...

  3. 7章 Admin

    Admin这个东西本身就已经存在于我们的项目中,是Django自己创建的.admin是Django自带的一个APP. # Application definition INSTALLED_APPS = ...

  4. 插入CSS的方法

    传送门    选择器  selector {declaration1; declaration2; ... declarationN }   例:   p { text-aligh:center; } ...

  5. 网站开发综合技术 第二部分 CSS样式表

    第2部分 CSS样式表 CSS(Cascading Style Sheets,层叠样式表),作用是美化HTML网页. /*注释*/    注释语法 2.1.样式表的基本概念 2.1.1.样式表分类 1 ...

  6. datagrid上面的查询按钮设置了,但是分页工具栏不显示

    原因:查询的linkbutton没有放在toolbar里. <script type="text/javascript"> $(function(){ $('#dg') ...

  7. 关于Pyhton多线程同步队列的应用

    ''' 同步队列 put方法和task_done方法, queue有一个未完成任务数量num,put依次num+1, task依次num-1.任务都完成时任务结束. 1.创建一个 Queue.Queu ...

  8. 可滚动的ResultSet类型 实现分页

    可滚动的ResultSet类型. 这个类型支持前后滚动取得纪录next().previous(),回到第一行first(),同时还支持要取的 ResultSet中的第几行 absolute(int n ...

  9. oracle创建临时表空间、用户表空间、创建用户关联表空间、授权等

    1.创建临时表空间 CREATE TEMPORARY TABLESPACE test_temp TEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test ...

  10. Spring+Spring MVC+Hibernate增查(使用注解)

    使用Spring+Spring MVC+Hibernate做增删改查开发效率真的很高.使用Hibernate简化了JDBC连接数据库的的重复性代码.下面根据自己做的一个简单的增加和查询,把一些难点分析 ...