1018: [SHOI2008]堵塞的交通traffic

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=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1;
 18     for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;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 = 100005;
 26
 27 struct Node{
 28     bool l, r, s, x, a, b, t[2];
 29     Node () {l = r = s = x = a = b = t[0] = t[1] = 0; }
 30 }T[N << 2];
 31 int n, A1, A2, B1, B2;
 32
 33 Node operator + (const Node &p, const Node &q) {
 34     Node ans;
 35     ans.t[0] = q.t[0], ans.t[1] = q.t[1];
 36     if (p.l || (p.s && p.t[0] && q.l && p.t[1] && p.x)) ans.l = 1;
 37     if (q.r || (q.s && p.t[0] && p.r && p.t[1] && q.x)) ans.r = 1;
 38     if ((p.s && p.t[0] && q.s) || (p.b && p.t[1] && q.a)) ans.s = 1;
 39     if ((p.x && p.t[1] && q.x) || (p.a && p.t[0] && q.b)) ans.x = 1;
 40     if ((p.x && p.t[1] && q.a) || (p.a && p.t[0] && q.s)) ans.a = 1;
 41     if ((p.s && p.t[0] && q.b) || (p.b && p.t[1] && q.x)) ans.b = 1;
 42     return ans;
 43 }
 44 void build(int l,int r,int rt) {
 45     if (l == r) {
 46         T[rt].s = T[rt].x = 1; return ;
 47     }
 48     int mid = (l + r) >> 1;
 49     build(lson); build(rson);
 50     T[rt] = T[rt << 1] + T[rt << 1 | 1];
 51 }
 52 void update1(int l,int r,int rt,int p,int opt) {
 53     if (l == r) {
 54         T[rt].t[A1 - 1] = opt; return;
 55     }
 56     int mid = (l + r) >> 1;
 57     if (p <= mid) update1(lson, p, opt);
 58     else update1(rson, p, opt);
 59     T[rt] = T[rt << 1] + T[rt << 1 | 1];
 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) >> 1;
 67     if (p <= mid) update2(lson, p, opt);
 68     else update2(rson, p, opt);
 69     T[rt] = T[rt << 1] + T[rt << 1 | 1];
 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) >> 1;
 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, 1, B1).r;
 82     int R = query(Root, B2, n).l;
 83     Node now = query(Root, B1, B2);
 84     if (A1 == A2) {
 85         if ((A1 == 1) && (now.s || (L && now.a) || (now.b && R) || (L && now.x && R))) return 1; // A1的判断!!!
 86         if ((A1 == 2) && (now.x || (L && now.b) || (now.a && R) || (L && now.s && R))) return 1;
 87     } else {
 88         if ((A1 == 1) && (now.b || (now.s && R) || (L && now.x) || (L && now.a && R))) return 1;
 89         if ((A1 == 2) && (now.a || (now.x && R) || (L && now.s) || (L && now.b && R))) return 1;
 90     }
 91     return 0;
 92 }
 93 int main() {
 94     n = read(); char opt[10];
 95     build(Root);
 96     while (true) {
 97         scanf("%s", opt);
 98         if (opt[0] == ‘E‘) break;
 99         A1 = read(), B1 = read(), A2 = read(), B2 = read();
100         if (B1 > B2) swap(A1, A2), swap(B1, B2);
101         if (opt[0] == ‘A‘) puts(solve() ? "Y" : "N");
102         else {
103             if (B1 != B2) update1(Root, B1, opt[0] == ‘O‘ ? 1 : 0);
104             else update2(Root, B1, opt[0] == ‘O‘ ? 1 : 0);
105         }
106     }
107     return 0;
108 }

原文地址:https://www.cnblogs.com/mjtcn/p/10102125.html

时间: 2024-10-21 22:47:08

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

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

1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submit][Status][Discuss] Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通

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

1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道

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

Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个 城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道路会变得不连通, 直到拥堵解决,道路才会恢复畅通.初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度 发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入

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

题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经典模型. 我们线段树的一个节点表示一个区间的联通性,有 6 个 bool 值,表示这个区间的 4 个角上的点之间的联通性. 然后用两个子区间的联通性和两个子区间之间的连边情况合并出整个区间的联通性. 修改某条边时,先在边的数组中修改,然后从这条边所在的点的线段树叶子开始向上 Update . 询问两

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

http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q<=100000)个操作,操作Open和Close是将格子的四个角相邻的城市连边或删边,操作Ask是询问两个城市是否连通 #include <cstdio> #include <cstring> #include <cmath> #include <string&

bzoj 1018: [SHOI2008]堵塞的交通traffic

由于只有两行,对一个区间可以维护四个角上的连通性 一共6个量,满足区间可加性,用线段树维护,查询时找出3段的量,看是否满足题解上的三种情况之一. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<queue> 7 #include<algorithm> 8

BZOJ 1018 SHOI2008 堵塞的交通traffic 线段树

题目大意:给定一张2*n的网格图,多次改变某条边是否可用,多次查询某两个点是否联通 多(yi)年前的我看到这题的第一反应是:这题尼玛能做? 两个点之间的路径可能是这样的: 也可能是这样的: 甚至可能是这样的: 这题能写? 这题其实好写爆了 我们首先忽略第三种情况,假设所有对答案有贡献的边都在两个点的中间 那么我们以每一列为一个叶节点建立线段树 线段树的每个节点开一个二维数组a[2][2] 其中 a[x][y]记录当前区间的左端点的第x行和右端点的第y行是否联通 那么合并如下: 例如,a[0][0

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

1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 1811  Solved: 580 [Submit][Status] Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通状况非常槽糕.有

[SHOI2008]堵塞的交通traffic(BZOJ1018)

Link is here 1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MB Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道路会变得不连通,直到拥堵