1018: [SHOI2008]堵塞的交通traffic

链接

分析:

  用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可。

  六种情况左上到右上(左边到右边的情况)……,左上到左下(同一侧相互到达的情况)……

  同一侧相互到达的情况,查询[l,r]是查的不完全。因为还有可能是先往左边走几步,下去,在走回来。这时候,查询一下[1,l]的情况,或起来即可。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<cctype>
  7. #include<set>
  8. #include<vector>
  9. #include<queue>
  10. #include<map>
  11. #define fi(s) freopen(s,"r",stdin);
  12. #define fo(s) freopen(s,"w",stdout);
  13. using namespace std;
  14. typedef long long LL;
  15.  
  16. inline int read() {
  17. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  18. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  19. }
  20.  
  21. #define Root 1, n, 1
  22. #define lson l, mid, rt << 1
  23. #define rson mid + 1, r, rt << 1 | 1
  24.  
  25. const int N = ;
  26.  
  27. struct Node{
  28. bool l, r, s, x, a, b, t[];
  29. Node () {l = r = s = x = a = b = t[] = t[] = ; }
  30. }T[N << ];
  31. int n, A1, A2, B1, B2;
  32.  
  33. Node operator + (const Node &p, const Node &q) {
  34. Node ans;
  35. ans.t[] = q.t[], ans.t[] = q.t[];
  36. if (p.l || (p.s && p.t[] && q.l && p.t[] && p.x)) ans.l = ;
  37. if (q.r || (q.s && p.t[] && p.r && p.t[] && q.x)) ans.r = ;
  38. if ((p.s && p.t[] && q.s) || (p.b && p.t[] && q.a)) ans.s = ;
  39. if ((p.x && p.t[] && q.x) || (p.a && p.t[] && q.b)) ans.x = ;
  40. if ((p.x && p.t[] && q.a) || (p.a && p.t[] && q.s)) ans.a = ;
  41. if ((p.s && p.t[] && q.b) || (p.b && p.t[] && q.x)) ans.b = ;
  42. return ans;
  43. }
  44. void build(int l,int r,int rt) {
  45. if (l == r) {
  46. T[rt].s = T[rt].x = ; return ;
  47. }
  48. int mid = (l + r) >> ;
  49. build(lson); build(rson);
  50. T[rt] = T[rt << ] + T[rt << | ];
  51. }
  52. void update1(int l,int r,int rt,int p,int opt) {
  53. if (l == r) {
  54. T[rt].t[A1 - ] = opt; return;
  55. }
  56. int mid = (l + r) >> ;
  57. if (p <= mid) update1(lson, p, opt);
  58. else update1(rson, p, opt);
  59. T[rt] = T[rt << ] + T[rt << | ];
  60. }
  61. void update2(int l,int r,int rt,int p,int opt) {
  62. if (l == r) {
  63. T[rt].l = T[rt].r = T[rt].a = T[rt].b = opt;
  64. return ;
  65. }
  66. int mid = (l + r) >> ;
  67. if (p <= mid) update2(lson, p, opt);
  68. else update2(rson, p, opt);
  69. T[rt] = T[rt << ] + T[rt << | ];
  70. }
  71. Node query(int l,int r,int rt,int L,int R) {
  72. if (L <= l && r <= R) {
  73. return T[rt];
  74. }
  75. int mid = (l + r) >> ;
  76. if (L > mid) return query(rson, L, R); // 注意这里的返回值,不能直接用一个ans来加
  77. else if (R <= mid) return query(lson, L, R);
  78. else return query(lson, L, R) + query(rson, L, R);
  79. }
  80. bool solve() {
  81. int L = query(Root, , B1).r;
  82. int R = query(Root, B2, n).l;
  83. Node now = query(Root, B1, B2);
  84. if (A1 == A2) {
  85. if ((A1 == ) && (now.s || (L && now.a) || (now.b && R) || (L && now.x && R))) return ; // A1的判断!!!
  86. if ((A1 == ) && (now.x || (L && now.b) || (now.a && R) || (L && now.s && R))) return ;
  87. } else {
  88. if ((A1 == ) && (now.b || (now.s && R) || (L && now.x) || (L && now.a && R))) return ;
  89. if ((A1 == ) && (now.a || (now.x && R) || (L && now.s) || (L && now.b && R))) return ;
  90. }
  91. return ;
  92. }
  93. int main() {
  94. n = read(); char opt[];
  95. build(Root);
  96. while (true) {
  97. scanf("%s", opt);
  98. if (opt[] == 'E') break;
  99. A1 = read(), B1 = read(), A2 = read(), B2 = read();
  100. if (B1 > B2) swap(A1, A2), swap(B1, B2);
  101. if (opt[] == 'A') puts(solve() ? "Y" : "N");
  102. else {
  103. if (B1 != B2) update1(Root, B1, opt[] == 'O' ? : );
  104. else update2(Root, B1, opt[] == 'O' ? : );
  105. }
  106. }
  107. return ;
  108. }

1018: [SHOI2008]堵塞的交通traffic的更多相关文章

  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. 1018: [SHOI2008]堵塞的交通traffic - BZOJ

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

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

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

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

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

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

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

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

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

  9. bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...

随机推荐

  1. antlr-2.7.6.jar的作用

    项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误

  2. BZOJ 1050 旅行comf 并查集+枚举下界

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 题目大意: 给你一个无向图,N(N<=500)个顶点, M(M<=5 ...

  3. 关于使用Filter降低Lucene tf idf打分计算的调研

    将query改成filter,lucene中有个QueryWrapperFilter性能比较差,所以基本上都须要自己写filter.包含TermFilter,ExactPhraseFilter,Con ...

  4. 巧用DNSlog实现无回显注入

    测试一些网站的时候,一些注入都是无回显的,我们可以写脚本来进行盲注,但有些网站会ban掉我们的ip,这样我们可以通过设置ip代理池解决, 但是盲注往往效率很低,所以产生了DNSlog注入.具体原理如下 ...

  5. xmppframework 简介

    XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开 ...

  6. vlc源码分析(三) 调用live555接收RTSP数据

    首先了解RTSP/RTP/RTCP相关概念,尤其是了解RTP协议:RTP与RTCP协议介绍(转载). vlc使用模块加载机制调用live555,调用live555的文件是live555.cpp. 一. ...

  7. Gradle Goodness: Renaming Files while Copying

    With the Gradle copy task we can define renaming rules for the files that are copied. We use the ren ...

  8. 在Red Hat Enterprise Linux 7.3上安装SQL Server 2017

    必要条件: 1.在此快速安装过程中,您需要安装SQL Server 2017或SQL Server 2019上Red Hat Enterprise Linux (RHEL) 7.3 +.然后使用sql ...

  9. BUAA OO 2019 第二单元作业总结

    目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...

  10. Vector/Push_back

    https://bbs.csdn.net/topics/370225285 https://blog.csdn.net/u013630349/article/details/46853297 http ...