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 #331 (Div. 2) B. Wilbur and Array 水题
B. Wilbur and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ...
- DELPHI 多线程
效果不正确 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Control ...
- mysql router 自动failover测试
mysql router 启动服务文件内容: [root@monitor mysqlrouter]# cat /etc/init.d/mysqlrouter#! /bin/bash## mysqlro ...
- [原]Sql脚本压缩类。
精简的美丽 /* * Sql脚本压缩类. * 去掉sql语句中多余的空格,以减少sql脚本的文本长度 * * Author : goldli@163.com * DateTime : 2015/07/ ...
- UNIX基础知识之文件和目录
程序清单1-1 列出一个目录中的所有文件(ls命令的简要实现): [root@localhost unix_env_advance_prog]# cat prog1-.c #include " ...
- 炼数成金hadoop视频干货04
视频地址:http://pan.baidu.com/s/1dDEgKwD 这一节讲的全是理论 任务执行优化 : 1.推测式执行: 2.重用JVM: 3.忽略模式. 除了手动修改Log4J.proper ...
- org.apache.hadoop.fs-BufferedFSInputStream
封装了FSInputStream package org.apache.hadoop.fs; import java.io.BufferedInputStream; import java.io.IO ...
- Web Navigation
Description Standard web browsers contain features to move backward and forward among the pages rece ...
- 玩转Android之手摸手教你DIY一个抢红包神器!
AccessibilityService是Google专门为残障人士设计的一个服务,可以让他们更方便的来操作手机.AccessibilityService一个主要功能是通过监听窗口的变化来判断用户当前 ...
- Jsonp post 跨域方案
近期在项目中遇到这样一问题,关于jsonp跨域问题,get传值是可以的,但post传值死活不行啊,于是网上看了一大堆关于这方面的资料,最终问题得以解决,今天抽空与大家分享下. 说明:http://ww ...