bzoj1018:[SHOI2008]堵塞的交通traffic
思路:线段树好题,用线段树维护连通性。
区间[l,r]表示左端点为l,右端点为r,宽度为2的矩形,那么线段树区间维护的就是该区间内的四个角的连通情况,注意是该区间内的连通情况,也就是说只能通过该区间内部进行连通而不能越出区间而进行连通。
一共六种连通情况:左上对右上,左上对左下,左上对右下,右上对左下,右上对右下,左下对右下。
线段树的每一个节点均维护一个域a[]用来维护该区间内的连通情况,对应下图所示

然后维护的话要注意的就是因为左儿子是[l,mid],右儿子是[mid+1,r],因为线段树叶子节点表示的是对应位置的格子,所以左儿子和右儿子之间是存在边的,那么就要考虑这条边是否连通,这会对连通性造成影响。
对于a1(a3类似)的维护:可以直接用左儿子的a1直接更新答案,也可以用左儿子的a2,a4,右儿子的a1,再加上中间跨过的两条边来更新答案(相当于从左边绕到右边再绕回到左边)。
对于a2(a4类似)的维护:可以用左儿子的a5,右儿子的a6,和下面那条边更新,也可以用左儿子的a2,右儿子的a2,和上面那条边更新。
对于a5(a6类似)的维护:可以用左儿子的a5,右儿子的a4,和下面那条边更新,也可以用左儿子的a2,右儿子的a5,和上面那条边更新。
最后就是query,因为线段树维护的是区间内的连通情况,所以就不能直接query输入的,因为可能会绕出区间再绕回来最终连通,这样就可能有四种情况,例子如下图所示:

然后分四种情况讨论即可。(细节的确有点小多,具体看代码)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 100005 int n,pre;
char s[10];
bool a[maxn*2],first; inline int read(){
int x=0;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar());
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x;
} int calc(int x,int y){return (x-1)*n+y;} struct segment_tree{
struct treenode{
bool a[7];
treenode(){}
treenode(int x){for (int i=1;i<=6;i++) a[i]=x;}
}tree[4*maxn];
void build(int p,int l,int r){
if (l==r){tree[p].a[2]=tree[p].a[4]=1;return;}
int mid=(l+r)>>1; build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
treenode merge(treenode ls,treenode rs,int mid){
treenode ans(0);
ans.a[1]=ls.a[1]|(ls.a[2]&a[calc(1,mid)]&rs.a[1]&a[calc(2,mid)]&ls.a[4]);
ans.a[2]=(ls.a[2]&a[calc(1,mid)]&rs.a[2])|(ls.a[5]&a[calc(2,mid)]&rs.a[6]);
ans.a[3]=rs.a[3]|(rs.a[2]&a[calc(1,mid)]&ls.a[3]&a[calc(2,mid)]&rs.a[4]);
ans.a[4]=(ls.a[6]&a[calc(1,mid)]&rs.a[5])|(ls.a[4]&a[calc(2,mid)]&rs.a[4]);
ans.a[5]=(ls.a[5]&a[calc(2,mid)]&rs.a[4])|(ls.a[2]&a[calc(1,mid)]&rs.a[5]);
ans.a[6]=(ls.a[6]&a[calc(1,mid)]&rs.a[2])|(ls.a[4]&a[calc(2,mid)]&rs.a[6]);
return ans;
}
void change1(int p,int l,int r,int x,int y){
if (x<=l&&r<=y){if (l!=r) tree[p]=merge(tree[p<<1],tree[p<<1|1],(l+r)>>1); return;}
int mid=(l+r)>>1;
if (x<=mid) change1(p<<1,l,mid,x,y);
if (y>mid) change1(p<<1|1,mid+1,r,x,y);
tree[p]=merge(tree[p<<1],tree[p<<1|1],mid);
}
void change2(int p,int l,int r,int pos){
if (l==r){tree[p].a[1]^=1,tree[p].a[3]^=1,tree[p].a[5]^=1,tree[p].a[6]^=1;return;}
int mid=(l+r)>>1;
if (pos<=mid) change2(p<<1,l,mid,pos);else change2(p<<1|1,mid+1,r,pos);
tree[p]=merge(tree[p<<1],tree[p<<1|1],mid);
}
void query(int p,int l,int r,int x,int y,treenode &ans){
if (x<=l&&r<=y){
if (first) ans=tree[p],first=0;
else ans=merge(ans,tree[p],pre);
pre=r;
return;
}
int mid=(l+r)>>1;
if (x<=mid) query(p<<1,l,mid,x,y,ans);
if (y>mid) query(p<<1|1,mid+1,r,x,y,ans);
}
treenode query(int l,int r){
treenode ans(0);first=1,pre=0;
query(1,1,n,l,r,ans);
return ans;
}
}T; int main(){
n=read(),T.build(1,1,n);
while (scanf("%s",s+1)!=EOF){
if (s[1]=='E') break;
if (s[1]=='O'||s[1]=='C'){
int x1=read(),y1=read(),x2=read(),y2=read();
if (y1>y2) swap(y1,y2);
if (x1==x2) a[calc(x1,y1)]^=1,T.change1(1,1,n,y1,y2);
else T.change2(1,1,n,y1);
}
else{
int x1=read(),y1=read(),x2=read(),y2=read();bool flag=0;
int mn=min(y1,y2),mx=max(y1,y2);
segment_tree::treenode t1=T.query(1,mn),t2=T.query(mn,mx),t3=T.query(mx,n);
if (x1==x2){
if (x1==1){
flag|=t2.a[2];
flag|=t1.a[3]&t2.a[6];
flag|=t2.a[5]&t3.a[1];
flag|=t1.a[1]&t2.a[4]&t3.a[1];
}
else{
flag|=t2.a[4];
flag|=t1.a[3]&t2.a[5];
flag|=t2.a[6]&t3.a[1];
flag|=t1.a[3]&t2.a[2]&t3.a[1];
}
}
else{
if ((x1==1&&y1<y2)||(x1==2&&y1>y2)){
flag|=t2.a[5];
flag|=t1.a[3]&t2.a[4];
flag|=t2.a[2]&t3.a[1];
flag|=t1.a[3]&t2.a[6]&t3.a[1];
}
else{
flag|=t2.a[6];
flag|=t1.a[3]&t2.a[2];
flag|=t2.a[4]&t3.a[1];
flag|=t1.a[3]&t2.a[5]&t3.a[1];
}
}
puts(flag?"Y":"N");
}
}
return 0;
}
bzoj1018:[SHOI2008]堵塞的交通traffic的更多相关文章
- 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 MB Submit: 3795 Solved: 1253 [Sub ...
- BZOJ1018 [SHOI2008]堵塞的交通traffic
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic
线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...
- Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树
题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
随机推荐
- Codeforces Round #326 (Div. 2) C. Duff and Weight Lifting 水题
C. Duff and Weight Lifting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- 经常使用的android弹出对话框
我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其它平台开发经验的朋友都会知道,大部分的平台都仅仅提供了几个最简单的实现,假设我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承 ...
- Wireshark抓包工具使用教程以及常用抓包规则
转载:http://fangxin.blog.51cto.com/1125131/735178 Wireshark是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具进行分析, ...
- SQL语言的四大分类
以下是sql数据语言类型的关键词: 1.数据定义语言DDL create.drop.alter.truncate 2.数据查询语言DQL select 3.数据操纵语言DML insert.dele ...
- 安装tomcat 证书
创建证书keystore 1) Mdmc用户登录服务器,执行如下命令: keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomc ...
- mongoDB 用java连接
(1)下载连接java 的驱动包mongo-2.10.1.jar 下载网址 https://github.com/mongodb/mongo-java-driver/downloads (2)导入下载 ...
- struts2 后台action向前端JSP传递参数的问题
后台有个方法,里面部分代码如下: System.out.print("alter:"+user.getId()); User temp=userservice.getUserByU ...
- wpf 父控件透明子控件不透明
在wpf开发中遇到子控件会继承父类控件属性的问题, 例如: <StackPanel Orientation="Horizontal" Grid.Row="1&quo ...
- python爬虫爬取全球机场信息
--2013年10月10日23:54:43 今天需要获取机场信息,发现一个网站有数据,用爬虫趴下来了所有数据: 目标网址:http://www.feeyo.com/airport_code.asp?p ...
- MySQL多实例配置
实验环境:RHEL6.4为最小化安装,mysql安装包为通用二进制安装包,版本为mysql-5.6.26 创建mysql用户 #useradd –M –s /sbin/nologin mysql #y ...