BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018
用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上,右下)(左下,右下)(左上,右下)(左下,右上)的连通情况。
因为是与相邻点的关系所以维护一个数组表示当前列x与列x+1的连边情况和当前列x的第一行与第二行的连边情况。
然后就是区间合并。。各种分类讨论。。
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define ll long long
#define maxn 100500
#define mm 998244353
using namespace std;
struct data{int b[],l,r;
}t[maxn*];
int road[maxn][],n;
char s[];
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
return x*f;
}
data M(data l,data r){
data i;
i.l=l.l; i.r=r.r;
i.b[]=(l.b[])||( ( (l.b[]&&l.b[]) || (l.b[]&&l.b[]) )&&(road[l.r][])&&(road[l.r][])&&(r.b[]));
i.b[]=(r.b[])||( ( (r.b[]&&r.b[]) || (r.b[]&&r.b[]) )&&(road[l.r][])&&(road[l.r][])&&(l.b[]));
i.b[]=(l.b[]&&r.b[]&&road[l.r][]) || (l.b[]&&r.b[]&&road[l.r][]);
i.b[]=(l.b[]&&r.b[]&&road[l.r][]) || (l.b[]&&r.b[]&&road[l.r][]);
i.b[]=(l.b[]&&r.b[]&&road[l.r][]) || (l.b[]&&r.b[]&&road[l.r][]);
i.b[]=(l.b[]&&r.b[]&&road[l.r][]) || (l.b[]&&r.b[]&&road[l.r][]);
return i;
}
void build(int i,int l,int r){
t[i].l=l; t[i].r=r; int mid=(l+r)/;
if (l==r){ t[i].b[]=t[i].b[]=; return; }
build(i*,l,mid); build(i*+,mid+,r);
t[i]=M(t[i*],t[i*+]);
}
void change(int pos,int i){
int l=t[i].l,r=t[i].r,mid=(l+r)/;
if (l==r){
rep(j,,) t[i].b[j]=road[l][];
t[i].b[]=t[i].b[]=;
return;
}
if (pos<=mid) change(pos,i*); else change(pos,i*+);
t[i]=M(t[i*],t[i*+]);
}
void change(int x0,int y0,int x1,int y1,int flag){
if (y0>y1) swap(x0,x1),swap(y0,y1);
if (x0==x1) {
if (x0==) road[y0][]=flag; else road[y0][]=flag;
} else road[y0][]=flag;
change(y0,);
}
data ask(int i,int tl,int tr){
int l=t[i].l,r=t[i].r,mid=(l+r)/;
if (l==tl&&r==tr) return t[i];
if (tr<=mid) return ask(i*,tl,tr);
else if (tl>mid) return ask(i*+,tl,tr);
else return M(ask(i*,tl,mid),ask(i*+,mid+,tr));
}
bool query(int x0,int y0,int x1,int y1){
if (y0>y1) swap(x0,x1),swap(y0,y1);
data x=ask(,,y0),y=ask(,y0,y1),z=ask(,y1,n);
if (x0==x1) {
if (x0==){
if (y.b[]) return ;
if ((x.b[]||y.b[])&&(y.b[]||z.b[])&&y.b[]) return ;
if ((y.b[])&&(y.b[]||z.b[])) return ;
if ((y.b[])&&(x.b[]||y.b[])) return ;
return ;
}
else {
if (y.b[]) return ;
if ((x.b[]||y.b[])&&(y.b[]||z.b[])&&y.b[]) return ;
if ((y.b[])&&(y.b[]||z.b[])) return ;
if ((y.b[])&&(x.b[]||y.b[])) return ;
return ;
}
}
else {
if (x0==){
if (y.b[]) return ;
if ((x.b[]||y.b[])&&y.b[]) return ;
if ((x.b[]||y.b[])&&(y.b[]||z.b[])&&y.b[]) return ;
if ((y.b[]||z.b[])&&y.b[]) return ;
return ;
}
else {
if (y.b[]) return ;
if ((x.b[]||y.b[])&&y.b[]) return ;
if ((x.b[]||y.b[])&&(y.b[]||z.b[])&&y.b[]) return ;
if ((y.b[]||z.b[])&&y.b[]) return ;
return ;
}
} }
int main(){
n=read();
build(,,n);
int x0,x1,y0,y1;
while (){
scanf("%s",s);
if (s[]=='E') break;
x0=read(); y0=read(); x1=read(); y1=read();
if (s[]=='O') change(x0,y0,x1,y1,);
else if (s[]=='C') change(x0,y0,x1,y1,);
else printf("%c\n",query(x0,y0,x1,y1)?'Y':'N');
}
return ;
}
BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)的更多相关文章
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- 数据结构(线段树):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 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set
题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
随机推荐
- ios 访问隐私信息 info.plist 中的字段
1.iOS10相册相机闪退bug: iOS10系统下调用系统相册,相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to acc ...
- 浅谈传统语音通信和APP语音通信音频软件开发之不同点
本人在传统的语音通信公司做过手机和IP电话上的语音软件开发,也在移动互联网公司做过APP上的语音软件开发.现在带实时语音通信功能的APP有好多,主流的有微信语音.QQ电话.钉钉等,当然也包括我开发过的 ...
- Java 读者写者问题
实验存档.V 允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写. 读者.java: package operating.entity.readerwriter; impor ...
- Cat 客户端采用什么策略上报消息树
策略分类 目前搞清楚两种 第一种(蓝色):默认服务器列表中选一个,算法核心是根据应用名的哈希值取模.也就是说同一个应用始终打到同一台服务器上,如果这台服务器挂了,另选一台服务器. 第二种(红色):应用 ...
- centos7 yum 安装 redis
//从中国科学技术大学开源镜像站 wget http://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.r ...
- Generation Axe 吉他之夜音乐会-广州站 感受
本人第一次看音乐会,演唱会跟音乐会是有区别的哈,演唱会以表演.舞蹈.歌唱为主,还有很多特别嘉宾 演出时间: 从20点开始一直到23点多才结束,有五个吉他手,开场跟结束五个吉他手一齐演出.平均每个人表演 ...
- Maven打包排除某个资源或者目录
最近在spark streaming本地调试的时候,引入了一些资源文件,打包的时候需要给排除掉.所以就考虑使用maven的方式 详细参考官方文档:https://maven.apache.org/pl ...
- 第四章初始CSS3预习笔记
第四章 初始CSS3预习笔记 一: 1: 什么是CSS? 全称是层叠样式表;/通常又称为风格样式表,.他是用来进行网页风格设计的; 2:CSS的优势: 1>内容以表现分离,即使用u前面学习的HT ...
- java多线程(八)-死锁问题和java多线程总结
为了防止对共享受限资源的争夺,我们可以通过synchronized等方式来加锁,这个时候该线程就处于阻塞状态,设想这样一种情况,线程A等着线程B完成后才能执行,而线程B又等着线程C,而线程C又等着线程 ...
- 【bird-front】全自动数据表格组件bird-grid
bird-grid是bird-front前端框架中实现的全自动数据表格组件.组件内部处理数据加载.分页.排序.查询.新增.编辑等一系列操作.让业务表格的开发从繁复的增删查改中脱离出来,编码简洁却又功能 ...