[BZOJ1018]堵塞的交通traffic
Description
有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可
以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个
城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通,
直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度
发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入膏肓的小人国交通系统。 小人国的交通
部将提供一些交通信息给你,你的任务是根据当前的交通情况回答查询的问题。交通信息可以分为以下几种格式:
Close r1 c1 r2 c2:相邻的两座城市(r1,c1)和(r2,c2)之间的道路被堵塞了;Open r1 c1 r2 c2:相邻的两座城
市(r1,c1)和(r2,c2)之间的道路被疏通了;Ask r1 c1 r2 c2:询问城市(r1,c1)和(r2,c2)是否连通。如果存在一
条路径使得这两条城市连通,则返回Y,否则返回N;
Input
第一行只有一个整数C,表示网格的列数。接下来若干行,每行为一条交通信息,以单独的一行“Exit”作为
结束。我们假设在一开始所有的道路都是堵塞的。我们保证 C小于等于100000,信息条数小于等于100000。
Output
对于每个查询,输出一个“Y”或“N”。
Sample Input
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
Sample Output
N
HINT
Source
麻烦的一批。先找出一共有几种情况要维护,尤其是不要漏掉先往外走再往里走的蛇皮走位

如果直接去维护某两点之间的路径是什么,是没法维护的。事实上两点之间不管是经历了怎样蛇皮的走位走过来,与我们都无关,我们要维护的只是两点是否联通。对于相邻两列四个点,如图,一共有六种路径,我们需要维护它们。而如何向上合并呢?我们还要维护两个儿子之间是否联通。这些想清楚了剩下的反而简单了,对着图慢慢打就行啦~
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ls node*2
#define rs node*2+1
#define M 100010
using namespace std;
struct Tree
{
bool l,r;//上下
bool s1,s2;//左上->右上,左下->右下
bool s3,s4;//左上->右下,左下->右上
bool half1,half2;//l,r重点M和M+1之间的连通性
}tr[M<<]; void build(int node,int l,int r)
{
if(l==r)
{
tr[node].half1=tr[node].half2=;
tr[node].s1=tr[node].s2=;
return;
}
int mid=(l+r)/;
build(ls,l,mid);
build(rs,mid+,r);
} void update(Tree &now,Tree L,Tree R)
{
now.l=L.l | (L.s1 & L.s2 & now.half1 & now.half2 & R.l);
now.r=R.r | (R.s1 & R.s2 & now.half1 & now.half2 & L.r);
now.s1=(L.s1 & R.s1 & now.half1) | (L.s3 & R.s4 & now.half2);
now.s2=(L.s2 & R.s2 & now.half2) | (L.s4 & R.s3 & now.half1);
now.s3=(L.s3 & R.s2 & now.half2) | (L.s1 & R.s3 & now.half1);
now.s4=(L.s4 & R.s1 & now.half1) | (L.s2 & R.s4 & now.half2);
} void changer(int node,int l,int r,int ud,int k,int val)
{
int mid=(l+r)/;
if(mid==k)
{
if(ud==) tr[node].half1=val;
else tr[node].half2=val;
update(tr[node],tr[ls],tr[rs]);
return;
}
if(k<=mid) changer(ls,l,mid,ud,k,val);
else changer(rs,mid+,r,ud,k,val);
update(tr[node],tr[ls],tr[rs]);
} void changec(int node,int l,int r,int k,int val)
{
if(l==r)
{
tr[node].s3=tr[node].s4=val;
tr[node].l=tr[node].r=val;
return;
}
int mid=(l+r)/;
if(k<=mid) changec(ls,l,mid,k,val);
else changec(rs,mid+,r,k,val);
update(tr[node],tr[ls],tr[rs]);
} Tree query(int node,int l,int r,int l1,int r1)
{
int mid=(l+r)/;
if(l1<=l&&r1>=r) return tr[node];
if(r1<=mid) return query(ls,l,mid,l1,r1);
else if(l1>mid) return query(rs,mid+,r,l1,r1);
else
{
Tree res=tr[node];
update(res,query(ls,l,mid,l1,r1),query(rs,mid+,r,l1,r1));
return res;
}
} int main()
{
int n;
scanf("%d",&n); build(,,n);
while()
{
char s[];
int r1,r2,c1,c2;
scanf("%s",s);
if(s[]=='E') break;
scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
if(c1>c2) swap(c1,c2),swap(r1,r2);
if(s[]=='O')
{
if(r1==r2) changer(,,n,r1,c1,);
else changec(,,n,c1,);
}
else if(s[]=='C')
{
if(r1==r2) changer(,,n,r1,c1,);
else changec(,,n,c1,);
}
else
{
Tree l=query(,,n,,c1),x=query(,,n,c1,c2),r=query(,,n,c2,n);
bool flag;
if(r1== && r2==) flag=x.s1 | (l.r & x.s4) | (r.l & x.s3) | (l.r & r.l & x.s2);
if(r1== && r2==) flag=x.s2 | (l.r & x.s3) | (r.l & x.s4) | (l.r & r.l & x.s1);
if(r1== && r2==) flag=x.s3 | (l.r & x.s2) | (r.l & x.s1) | (l.r & r.l & x.s4);
if(r1== && r2==) flag=x.s4 | (l.r & x.s1) | (r.l & x.s2) | (l.r & r.l & x.s3);
puts(flag?"Y":"N");
}
}
return ;
}
[BZOJ1018]堵塞的交通traffic的更多相关文章
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- 【bzoj1018】[SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2887 Solved: 954[Submit ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- 【BZOJ】【1018】【SHOI2008】堵塞的交通traffic
线段树 这题的线段树+分类讨论蛮神奇的……我以前学的线段树简直就是渣渣QAQ 看了下ydc题解里的思想>_>用线段树维护连通性!那么就自己写吧……每个节点表示一段区间的连通性(我的叶子节点 ...
- 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 864 Descri ...
- BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2247 Solved: 706[Submit ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...
随机推荐
- 一次Tomcat6.0.33版本号与6.0.44版本号差异所引发的问题
前序(公司应用为Web应用, 部署serverLinux + Nginx + Tomcat ) 一天收到公司报警邮件,显示个别机器方法调用严重超时,寻常都是在100ms以内响应的方法,突然某段时间响应 ...
- Jmeter非GUI分布式测试
增加参数 -r : 指远程将所有agent启动 Eg: jmeter -n -t purang_yyt_uat_bless_1000_2_0.jmx -r -l purang_yyt_uat_bles ...
- 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
[BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...
- Dart基础学习01--走近Dart
什么是Dart 在Dart的官网上是这样介绍Dart的: Dart is an open-source, scalable programming language, with robust libr ...
- python之设置小数保留位数
python之设置小数保留位数 test.py: a = [3,4,4,4,6,4] average1 = float(sum(a)/len(a)) average2 =round(average1, ...
- 关于jQuery中nth-child和nth-of-type的详解
首先贴出来HTML的代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 洛谷 P1641 [SCOI2010]生成字符串
洛谷 这题一看就是卡塔兰数. 因为\(cnt[1] \leq cnt[0]\),很显然的卡塔兰嘛! 平时我们推导卡塔兰是用一个边长为n的正方形推的, 相当于从(0,0)点走到(n,n)点,向上走的步数 ...
- 细数Python中的数据类型以及他们的方法
一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...
- mysql什么情况下使用索引
表的主关键字 自动建立唯一索引 如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号) 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 如lc_hj(流程环节)中的lc_bh+h ...
- 初识Locust---认识
性 能测试工具: 基于Python的性能测试工具-locust 现在性能测试方面有很多测试工具,比如我们熟悉的loadrunner.jmeter.ab等,用过的也就是这几种,如果是学过这些工具的可能对 ...