题目很好明白,然后实现很神奇。首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行。然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优。于是看了题解,发现了线段树的神奇用途。

我们维护每个矩形四个顶点的六个变量,分别是:

g[0]:表示第一行左右端点的连通性。

g[1]:表示第二行左右端点的连通性。

g[2]:左上端点和左下端点的连通性。

g[3]:右上端点和右下端点的连通性。

g[4]:左上端点和右下端点的连通性。

g[5]:左下端点和右上端点的连通性。

这六个变量做好之后就可以合并矩形了。同样是这六个变量,合并的时候需要费点事,考虑一下各种情况。

最后需要的一点就是可能出现的特殊情况,这样的怎么办?

我们考虑全面即可,查询的时候不光查询一个区间,还需要查询两头的区间,然后判断是否会出现这种情况,就是我写的solve函数里面判断答案的后三种情况。 ——by VANE

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. struct node{bool g[];};
  5. int n;
  6. node s[],t[N*];
  7. bool m[N*];
  8. int calc(int x,int y){return x*(n-)+y;}
  9. void build(int rt,int l,int r)
  10. {
  11. if(l==r) {t[rt]=s[];return;}
  12. int mid=l+r>>;
  13. build(rt<<,l,mid);
  14. build(rt<<|,mid+,r);
  15. }
  16. node merge(node a,node b,bool x,bool y)
  17. {
  18. node c;
  19. c.g[]=(a.g[]&&x&&b.g[])||(a.g[]&&y&&b.g[]);
  20. c.g[]=(a.g[]&&y&&b.g[])||(a.g[]&&x&&b.g[]);
  21. c.g[]=(a.g[])||(a.g[]&&x&&b.g[]&&y&&a.g[]);
  22. c.g[]=(b.g[])||(b.g[]&&x&&a.g[]&&y&&b.g[]);
  23. c.g[]=(a.g[]&&x&&b.g[])||(a.g[]&&y&&b.g[]);
  24. c.g[]=(b.g[]&&x&&a.g[])||(b.g[]&&y&&a.g[]);
  25. return c;
  26. }
  27. void insert(int rt,int l,int r,int x,int y,int xx,int yy,bool c)
  28. {
  29. int mid=l+r>>;
  30. if(x==xx&&y==mid)
  31. {
  32. m[calc(x,y)]=c;
  33. t[rt]=merge(t[rt<<],t[rt<<|],m[calc(,mid)],m[calc(,mid)]);
  34. return;
  35. }
  36. else if(x!=xx&&l==r){t[rt]=s[c];return;}
  37. if(y<=mid) insert(rt<<,l,mid,x,y,xx,yy,c);
  38. if(y>mid) insert(rt<<|,mid+,r,x,y,xx,yy,c);
  39. t[rt]=merge(t[rt<<],t[rt<<|],m[calc(,mid)],m[calc(,mid)]);
  40. }
  41. node query(int rt,int l,int r,int ll,int rr)
  42. {
  43. int mid=r+l>>;
  44. if(l>=ll&&r<=rr) return t[rt];
  45. if(rr<=mid)return query(rt<<,l,mid,ll,rr);
  46. if(ll>mid) return query(rt<<|,mid+,r,ll,rr);
  47. return merge(query(rt<<,l,mid,ll,rr),query(rt<<|,mid+,r,ll,rr),m[calc(,mid)],m[calc(,mid)]);
  48. }
  49. void solve(int x,int y,int xx,int yy)
  50. {
  51. bool ans;
  52. s[]=query(,,n,,y);
  53. s[]=query(,,n,y,yy);
  54. s[]=query(,,n,yy,n);
  55. if(x==xx) ans=(s[].g[x])||(s[].g[]&&s[].g[+x^])||(s[].g[]&&s[].g[+x])||(s[].g[]&&s[].g[]&&s[].g[x^]);
  56. else ans=(s[].g[+x])||(s[].g[]&&s[].g[x^])||(s[].g[]&&s[].g[x])||(s[].g[]&&s[].g[+x^]&&s[].g[]);
  57. if(ans) puts("Y");
  58. else puts("N");
  59.  
  60. }
  61. int main()
  62. {
  63. scanf("%d",&n);
  64. s[]=(node){,,,,,};
  65. s[]=(node){,,,,,};
  66. memset(t,,sizeof t);
  67. memset(m,,sizeof m);
  68. build(,,n);
  69. char ch[];scanf("%s",ch);
  70. while(ch[]!='E')
  71. {
  72. int x,y,xx,yy;scanf("%d%d%d%d",&x,&y,&xx,&yy);
  73. if(y>yy) swap(x,xx),swap(y,yy);
  74. x--;xx--;
  75. if(ch[]=='O') insert(,,n,x,y,xx,yy,);
  76. else if(ch[]=='C') insert(,,n,x,y,xx,yy,);
  77. else solve(x,y,xx,yy);
  78. scanf("%s",ch);
  79. }
  80. }

BZOJ1018 堵塞的交通(线段树)的更多相关文章

  1. BZOJ1018[SHOI2008]堵塞的交通——线段树

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...

  2. bzoj1018/luogu4246 堵塞的交通 (线段树)

    对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...

  3. Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)

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

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

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

  5. [HNOI2014] 道路堵塞 - 最短路,线段树

    对不起对不起,辣鸡蒟蒻又来用核弹打蚊子了 完全ignore了题目给出的最短路,手工搞出一个最短路,发现对答案没什么影响 所以干脆转化为经典问题:每次询问删掉一条边后的最短路 如果删掉的是非最短路边,那 ...

  6. [BZOJ1018]堵塞的交通traffic

    Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一 ...

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

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

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

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

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

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

随机推荐

  1. R3—日期处理

    一. 问题引入 下面是一个房地产价格数据,现在想要提取2008年6月份的数据进行分析,在R中该如何操作呢? city price bedrooms squarefeet lotsize latitud ...

  2. 【BZOJ】1251: 序列终结者

    [题意]给定含有n个0的的数列. 1.区间加值 2.区间翻转 3.区间求最大值 [算法]平衡树(fhq-treap) 需要特别注意的是: 1.使0点对全局无影响并全程保持(例如求max,t[0].mx ...

  3. iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...

  4. POJ 3233 Matrix Power Series (矩阵快速幂)

    题目链接 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + - ...

  5. Tensorflow常用函数说明(一)

    首先最开始应该清楚一个知识,最外面的那个[ [ [ ]]]括号代表第一维,对应维度数字0,第二个对应1,多维时最后一个对应数字-1:因为后面有用到 1 矩阵变换 tf.shape(Tensor) 返回 ...

  6. JavaScript 判断手机端访问并跳转 redirect mobile

    假如你的手机端网站在 /m 目录下 (function(a,b){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer| ...

  7. 2018 黑盾杯部分writeup

    这次比赛拿了三十多名.呵呵.或许这就是菜吧. 比赛经验教训: 1.赛前一定要调整好情绪. 2.比赛尽量不要紧张,每一题都认认真真的看过去! 3.站在出题者的角度去思考问题 4.刷题 5.还是情绪吧.其 ...

  8. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

  9. 移动端测试===adb shell top命令解释

    adb shell top top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序. top 用法 >a ...

  10. 解决su – 后显示-bash-4.1#

    <1>现象 设置tfs的管理用户时. su - admin时,出现 -bash-4.1# <2>解决 chown  admin:admin /home/admin        ...