BZOJ1018[SHOI2008]堵塞的交通——线段树
题目描述
有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可
以被看成是一个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;
输入
第一行只有一个整数C,表示网格的列数。接下来若干行,每行为一条交通信息,以单独的一行“Exit”作为
结束。我们假设在一开始所有的道路都是堵塞的。我们保证 C小于等于100000,信息条数小于等于100000。
输出
对于每个查询,输出一个“Y”或“N”。
样例输入
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
样例输出
N

#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int t[100010][8];
int n;
char ch[10];
int a,b,c,d;
struct miku
{
int luld;
int rurd;
int lurd;
int ruld;
int luru;
int ldrd;
}s[800010];
void merge(miku &z,miku x,miku y,int mid)
{
z.luld=(x.luld)||(x.luru&&t[mid][1]&&y.luld&&t[mid][2]&&x.ldrd);
z.rurd=(y.rurd)||(y.luru&&t[mid][1]&&x.rurd&&t[mid][2]&&y.ldrd);
z.lurd=(x.lurd&&t[mid][2]&&y.ldrd)||(x.luru&&t[mid][1]&&y.lurd);
z.ruld=(x.ruld&&t[mid][1]&&y.luru)||(x.ldrd&&t[mid][2]&&y.ruld);
z.luru=(x.lurd&&t[mid][2]&&y.ruld)||(x.luru&&t[mid][1]&&y.luru);
z.ldrd=(x.ruld&&t[mid][1]&&y.lurd)||(x.ldrd&&t[mid][2]&&y.ldrd);
}
void build(int rt,int l,int r)
{
if(l==r)
{
s[rt].luru=1;
s[rt].ldrd=1;
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
merge(s[rt],s[rt<<1],s[rt<<1|1],mid);
}
void change1(int rt,int l,int r,int x,int k)
{
if(l==r)
{
s[rt].lurd=s[rt].ruld=s[rt].luld=s[rt].rurd=k;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
{
change1(rt<<1,l,mid,x,k);
}
else if(x>mid)
{
change1(rt<<1|1,mid+1,r,x,k);
}
merge(s[rt],s[rt<<1],s[rt<<1|1],mid);
}
void change2(int rt,int l,int r,int x,int y,int k)
{
int mid=(l+r)>>1;
if(x==mid)
{
t[x][y]=k;
merge(s[rt],s[rt<<1],s[rt<<1|1],mid);
return ;
}
if(x<=mid)
{
change2(rt<<1,l,mid,x,y,k);
}
else if(x>mid)
{
change2(rt<<1|1,mid+1,r,x,y,k);
}
merge(s[rt],s[rt<<1],s[rt<<1|1],mid);
}
miku query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return s[rt];
}
int mid=(l+r)>>1;
if(R<=mid)
{
return query(rt<<1,l,mid,L,R);
}
if(L>mid)
{
return query(rt<<1|1,mid+1,r,L,R);
}
miku ans;
merge(ans,query(rt<<1,l,mid,L,R),query(rt<<1|1,mid+1,r,L,R),mid);
return ans;
}
int ask(int a,int b,int c,int d)
{
miku ls=query(1,1,n,1,b);
miku ms=query(1,1,n,b,d);
miku rs=query(1,1,n,d,n);
int t1,t2,t3,t4;
if(a==1&&c==1)
{
t1=ms.luru;
t2=(ls.rurd&&ms.ruld);
t3=(ms.lurd&&rs.luld);
t4=(ls.rurd&&ms.ldrd&&rs.luld);
if(t1||t2||t3||t4)
{
return 1;
}
else
{
return 0;
}
}
else if(a==1&&c==2)
{
t1=ms.lurd;
t2=(ls.rurd&&ms.ldrd);
t3=(ms.luru&&rs.luld);
t4=(ls.rurd&&ms.ruld&&rs.luld);
if(t1||t2||t3||t4)
{
return 1;
}
else
{
return 0;
}
}
else if(a==2&&c==1)
{
t1=ms.ruld;
t2=(ls.rurd&&ms.luru);
t3=(ms.ldrd&&rs.luld);
t4=(ls.rurd&&ms.lurd&&rs.luld);
if(t1||t2||t3||t4)
{
return 1;
}
else
{
return 0;
}
}
else if(a==2&&c==2)
{
t1=ms.ldrd;
t2=(ls.rurd&&ms.lurd);
t3=(ms.ruld&&rs.luld);
t4=(ls.rurd&&ms.luru&&rs.luld);
if(t1||t2||t3||t4)
{
return 1;
}
else
{
return 0;
}
}
}
int main()
{
scanf("%d",&n);
build(1,1,n);
while(1)
{
scanf("%s",ch);
if(ch[0]=='E')
{
break;
}
scanf("%d%d%d%d",&a,&b,&c,&d);
if(b>d)
{
swap(b,d);
swap(a,c);
}
if(ch[0]=='O')
{
if(a==c)
{
change2(1,1,n,b,a,1);
}
else
{
change1(1,1,n,b,1);
}
}
else if(ch[0]=='C')
{
if(a==c)
{
change2(1,1,n,b,a,0);
}
else
{
change1(1,1,n,b,0);
}
}
else
{
ask(a,b,c,d)==1?printf("Y\n"):printf("N\n");
}
}
}
BZOJ1018[SHOI2008]堵塞的交通——线段树的更多相关文章
- Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...
- bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic
线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...
- BZOJ1018 SHOI2008堵塞的交通(线段树)
动态图的连通性当然是可以用LCT维护的.但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢. 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径 ...
随机推荐
- ASP 基础二 内置对象
一 Request 二 Response 三 Application 四 Session 五 Server <script language="vbscript" runat ...
- Linux_软件安装管理
开始学习rpm,yum等命令的使用,下面的地址可供你学习 大部分都大同小异! 感谢作者:https://segmentfault.com/a/1190000011200461
- ng-include文件实现ng-repeat
Angularjs实现自由度很高.比如ng-repeat可以以包含的文件中实现数据循环. 如: 当我们把这html文件被ng-include包含时,它完全能正常呈现对应的数据: 创建应用app: 创建 ...
- python第二周。2019.4.13
1, 我绘制大蟒蛇就是..保存也对着呢,你要是打开文件的话,先闪个黑屏,再闪个白屏..自动退出,然后啥都没了. 我觉得是我代码编错了...再来一遍! 这次到可以,但是这个大蟒蛇好像没有回头... 刚才 ...
- NTP服务部署和测试
1. 概述2. 部署3. 配置4. 客户端配置4.1 客户端安装ntpdate4.2 同步设置 1. 概述 本篇博客主要记录如何部署一台NTP服务器,用于内网时间同步. 时间服务器对于集群内部节点之间 ...
- 从零开始搭建属于你的React/redux/webpack脚手架
大家好,我是苏南,今天要给大家分享的是<<我的react入门到放弃之路>>,当然,也不是真的放弃啦--哈哈,这篇博客原本是从17年初写的,一直没有在csdn发布,希望今天不会太 ...
- Ionic2 下处理 Android 设备下返回按钮的事件
原文发表于我的技术博客 本文分享了 Ionic2 下处理 Android 设备下返回按钮的事件,供参考. 原文发表于我的技术博客 代码中我分享了如何捕捉 Ionic2 项目在 Android 设备下返 ...
- LVS负载均衡下session共享的实现方式-持久化连接
之前简单介绍LVS负载均衡的高可用方案实施,下面详细说明LVS的session解决方案: LVS算法中,SH算法可以实现将同一客户端的请求总是发送给第一次指定的RS,除非该RS出现故障不能再提供服务. ...
- Oracle日常运维操作总结-数据库的启动和关闭
下面是工作中对Oracle日常管理操作的一些总结,都是一些基本的oracle操作和SQL语句写法,在此梳理成手册,希望能帮助到初学者(如有梳理不准确之处,希望指出). 一.数据库的启动和关闭 1.1 ...
- Python练习-8
1,复习 ascii:字母,数字,特殊字符:1个字节,8位 Unicode:16位 两个字节 升级 32 位 四个字节 utf-8:最少一个字节 8位表示. 英文字母 8位 1个字节 欧洲16位,2个 ...