1018: [SHOI2008]堵塞的交通traffic

链接

分析:

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

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

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

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} #define Root 1, n, 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1 const int N = ; struct Node{
bool l, r, s, x, a, b, t[];
Node () {l = r = s = x = a = b = t[] = t[] = ; }
}T[N << ];
int n, A1, A2, B1, B2; Node operator + (const Node &p, const Node &q) {
Node ans;
ans.t[] = q.t[], ans.t[] = q.t[];
if (p.l || (p.s && p.t[] && q.l && p.t[] && p.x)) ans.l = ;
if (q.r || (q.s && p.t[] && p.r && p.t[] && q.x)) ans.r = ;
if ((p.s && p.t[] && q.s) || (p.b && p.t[] && q.a)) ans.s = ;
if ((p.x && p.t[] && q.x) || (p.a && p.t[] && q.b)) ans.x = ;
if ((p.x && p.t[] && q.a) || (p.a && p.t[] && q.s)) ans.a = ;
if ((p.s && p.t[] && q.b) || (p.b && p.t[] && q.x)) ans.b = ;
return ans;
}
void build(int l,int r,int rt) {
if (l == r) {
T[rt].s = T[rt].x = ; return ;
}
int mid = (l + r) >> ;
build(lson); build(rson);
T[rt] = T[rt << ] + T[rt << | ];
}
void update1(int l,int r,int rt,int p,int opt) {
if (l == r) {
T[rt].t[A1 - ] = opt; return;
}
int mid = (l + r) >> ;
if (p <= mid) update1(lson, p, opt);
else update1(rson, p, opt);
T[rt] = T[rt << ] + T[rt << | ];
}
void update2(int l,int r,int rt,int p,int opt) {
if (l == r) {
T[rt].l = T[rt].r = T[rt].a = T[rt].b = opt;
return ;
}
int mid = (l + r) >> ;
if (p <= mid) update2(lson, p, opt);
else update2(rson, p, opt);
T[rt] = T[rt << ] + T[rt << | ];
}
Node query(int l,int r,int rt,int L,int R) {
if (L <= l && r <= R) {
return T[rt];
}
int mid = (l + r) >> ;
if (L > mid) return query(rson, L, R); // 注意这里的返回值,不能直接用一个ans来加
else if (R <= mid) return query(lson, L, R);
else return query(lson, L, R) + query(rson, L, R);
}
bool solve() {
int L = query(Root, , B1).r;
int R = query(Root, B2, n).l;
Node now = query(Root, B1, B2);
if (A1 == A2) {
if ((A1 == ) && (now.s || (L && now.a) || (now.b && R) || (L && now.x && R))) return ; // A1的判断!!!
if ((A1 == ) && (now.x || (L && now.b) || (now.a && R) || (L && now.s && R))) return ;
} else {
if ((A1 == ) && (now.b || (now.s && R) || (L && now.x) || (L && now.a && R))) return ;
if ((A1 == ) && (now.a || (now.x && R) || (L && now.s) || (L && now.b && R))) return ;
}
return ;
}
int main() {
n = read(); char opt[];
build(Root);
while (true) {
scanf("%s", opt);
if (opt[] == 'E') break;
A1 = read(), B1 = read(), A2 = read(), B2 = read();
if (B1 > B2) swap(A1, A2), swap(B1, B2);
if (opt[] == 'A') puts(solve() ? "Y" : "N");
else {
if (B1 != B2) update1(Root, B1, opt[] == 'O' ? : );
else update2(Root, B1, opt[] == 'O' ? : );
}
}
return ;
}

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. JavaScript的DOM_通过元素的class属性操作样式

    使用 style 属性可以设置行内的 CSS 样式,而通过 id 和 class 调用是最常用的方法. <script type="text/javascript"> ...

  2. SOJ 4309 Sum of xor 异或/思维

    Source ftiasch 解题思路: 本题的题解有参考这里,但是那篇年代太久远,讲的也不甚清晰,所以可能会对很多新手造成困扰,所以又写了这一篇. 亦或有很多规律,本题使用到的是n^(n+1)=1, ...

  3. C++作用域 (二)

    http://www.cnblogs.com/wolf-lifeng/p/3156936.html 2.3全局作用域 2.3.1概述 全局作用域是最大的名字空间作用域,不同于用户自定义的名字空间作用域 ...

  4. LeetCode: Word Ladder II [127]

    [题目] Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) ...

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

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

  6. python学习day24 项目目录结构

    项目目录结构 脚本 插入模块:先插入内置模块,然后第三方某块,上短下长! 单可执行文件 config 配置相关 db (database) 数据相关 lib (librarie) 公共功能 src 业 ...

  7. 前端页面 SEO 优化

    SEO要点:1.语义化html标签,用合适的标签嵌套合适的内容,不可过分依赖div,对浏览器更友善就能更容易被抓取.2.重要的内容html代码放在前面/左边.搜索引擎爬虫是从左往右,从上到下进行抓取的 ...

  8. VS2012与VS2015同时安装用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No such file or directory”的解决办法

    在WIndows 7操作系统上同时安装VS2012与VS2015并用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No ...

  9. android TextView里边实现图文混配效果

    做的游戏攻略中的图文载入已经用TextView实现.但看到网易新闻里的内容.点击图片能够调到一个新的Activity ,感觉也像Textview 实现的,但不知道怎么弄,想想能够通过动态载入Textv ...

  10. TensorFlow简要教程及线性回归算法示例

    TensorFlow是谷歌推出的深度学习平台,目前在各大深度学习平台中使用的最广泛. 一.安装命令 pip3 install -U tensorflow --default-timeout=1800 ...