【BZOJ1018】堵塞的交通(线段树)
【BZOJ1018】堵塞的交通(线段树)
题面
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
2
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
Sample Output
Y
N
题解
毒瘤题
神题
欢迎入坑
BZOJ上有题解
我只讲线段树如何维护
对于每一个节点
维护的是一段区间
也就是一个矩形
现在我们维护的是这个矩形的四个顶点之间的两两的联通性
这个一顿分类讨论就好了
对于叶子节点,因为会直接的修改边
因此不能够只维护点的连通性
还要维护一下边,
再用边来推出点的连通性再向上递归
每一次的询问
先询问给定的区间
再询问1左端点以及右端点n
因为联通的情况无非就是
①在自己的区间内之间联通
②出去走一圈再回来
所以,又是一顿分类讨论,这里就很好解决了
细节太多了,不好细讲
边界情况仔细讨论
可以直接看代码
其中,我的代码
小写的l1,l2,r1,r2分别对应矩形左侧的两个点和右侧的两个点的连通性
L1等大写的表示的边的连通性
这题真是写死我了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 120000
#define lson (now<<1)
#define rson (now<<1|1)
#define rg register
inline int read()
{
rg int x=0,t=1;rg char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,P;
struct Node
{
bool l1l2,r1r2,l1r1,l1r2,l2r1,l2r2,L1L2,R1R2,L1R1,L2R2;
void init(){l1l2=r1r2=l1r1=l1r2=l2r1=l2r2=L1L2=R1R2=L1R1=L2R2=false;}
}t[MAX<<3];
Node Merge(Node x,Node y)
{
rg Node ret;ret.init();
ret.l1r1=(x.l1r1&y.l1r1)|(x.l1r2&y.l2r1);
ret.l2r2=(x.l2r2&y.l2r2)|(x.l2r1&y.l1r2);
ret.l1l2=(x.l1l2)|(ret.l1r1&ret.l2r2&y.r1r2);
ret.r1r2=(y.r1r2)|(ret.l1r1&ret.l2r2&x.l1l2);
ret.l1r2=(x.l1r1&y.l1r2)|(x.l1r2&y.l2r2);
ret.l2r1=(x.l2r2&y.l2r1)|(x.l2r1&y.l1r1);
return ret;
}
void Count(Node &a)
{
a.l1r1=(a.L1R1)|(a.L1L2&a.L2R2&a.R1R2);
a.l2r2=(a.L2R2)|(a.L1L2&a.L1R1&a.R1R2);
a.l1l2=(a.L1L2)|(a.L1R1&a.R1R2&a.L2R2);
a.r1r2=(a.R1R2)|(a.L1R1&a.L1L2&a.L2R2);
a.l1r2=(a.L1R1&a.R1R2)|(a.L1L2&a.L2R2);
a.l2r1=(a.L1L2&a.L1R1)|(a.L2R2&a.R1R2);
}
void Modify_C(int now,int l,int r,int pos)
{
if(l==r)
{
if(P==1)t[now].L1R1=false;
else if(P==2)t[now].L2R2=false;
else if(P==3)t[now].L1L2=false;
else if(P==4)t[now].R1R2=false;
Count(t[now]);
return;
}
rg int mid=(l+r)>>1;
if(pos<=mid)Modify_C(lson,l,mid,pos);
else Modify_C(rson,mid+1,r,pos);
t[now]=Merge(t[lson],t[rson]);
}
void Modify_O(int now,int l,int r,int pos)
{
if(l==r)
{
if(P==1)t[now].L1R1=true;
else if(P==2)t[now].L2R2=true;
else if(P==3)t[now].L1L2=true;
else if(P==4)t[now].R1R2=true;
Count(t[now]);
return;
}
rg int mid=(l+r)>>1;
if(pos<=mid)Modify_O(lson,l,mid,pos);
else Modify_O(rson,mid+1,r,pos);
t[now]=Merge(t[lson],t[rson]);
}
Node Query(int now,int l,int r,int al,int ar)
{
if(l==al&&r==ar)return t[now];
rg int mid=(l+r)>>1;
if(ar<=mid)return Query(lson,l,mid,al,ar);
if(al>mid)return Query(rson,mid+1,r,al,ar);
return Merge(Query(lson,l,mid,al,mid),Query(rson,mid+1,r,mid+1,ar));
}
int main()
{
n=read()-1;
rg char ch[20];
while(233)
{
scanf("%s",ch);if(ch[0]=='E')break;
else if(ch[0]=='O')
{
rg int r1=read(),c1=read(),r2=read(),c2=read();
if(c1>c2)swap(r1,r2),swap(c1,c2);
if(r1==r2&&r1==1)P=1,Modify_O(1,1,n,c1);
else if(r1==r2&&r1==2)P=2,Modify_O(1,1,n,c1);
else if(c1==c2){if(c1!=1){P=4,Modify_O(1,1,n,c1-1);}if(c1<=n)P=3,Modify_O(1,1,n,c1);}
}
else if(ch[0]=='C')
{
rg int r1=read(),c1=read(),r2=read(),c2=read();
if(c1>c2)swap(r1,r2),swap(c1,c2);
if(r1==r2&&r1==1)P=1,Modify_C(1,1,n,c1);
else if(r1==r2&&r1==2)P=2,Modify_C(1,1,n,c1);
else if(c1==c2){if(c1!=1){P=4,Modify_C(1,1,n,c1-1);}if(c1<=n)P=3,Modify_C(1,1,n,c1);}
}
else
{
rg int r1=read(),c1=read(),r2=read(),c2=read();
if(c1>c2)swap(r1,r2),swap(c1,c2);
if(c1==c2)
{
if(r1 ==r2)puts("Y");
else
{
rg Node x,y;x.init();y.init();
if(c1>1)(x=Query(1,1,n,1,c1-1));
if(c1<=n)(y=Query(1,1,n,c1,n));
(x.r1r2||y.l1l2)?puts("Y"):puts("N");
}
continue;
}
rg Node x,y,z;x.init();y.init();z.init();
x=Query(1,1,n,c1,c2-1);if(c1>=2)y=Query(1,1,n,1,c1-1);if(c2<=n)z=Query(1,1,n,c2,n);
if(r1==r2)
{
if(r1==1)((x.l1r1)||(y.r1r2&&(x.l2r1||(x.l2r2&&z.l1l2))))?puts("Y"):puts("N");
else((x.l2r2)||(y.r1r2&&(x.l1r2||(x.l1r1&&z.l1l2))))?puts("Y"):puts("N");
}
else
{
if(r1==1)((x.l1r2)||(y.r1r2&&x.l2r2)||(x.l1r1&&z.l1l2))?puts("Y"):puts("N");
else((x.l2r1)||(y.r1r2&&x.l1r1)||(x.l2r2&&z.l1l2))?puts("Y"):puts("N");
}
}
}
return 0;
}
【BZOJ1018】堵塞的交通(线段树)的更多相关文章
- BZOJ1018 堵塞的交通(线段树)
题目很好明白,然后实现很神奇.首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行.然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优.于是看了题解,发现了线段树的神奇用途. 我们维护 ...
- BZOJ1018[SHOI2008]堵塞的交通——线段树
题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...
- bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...
- Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
- [HNOI2014] 道路堵塞 - 最短路,线段树
对不起对不起,辣鸡蒟蒻又来用核弹打蚊子了 完全ignore了题目给出的最短路,手工搞出一个最短路,发现对答案没什么影响 所以干脆转化为经典问题:每次询问删掉一条边后的最短路 如果删掉的是非最短路边,那 ...
- [BZOJ1018]堵塞的交通traffic
Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一 ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
随机推荐
- vagrant启动报错The following SSH command responded with a no
vagrant package打包生成box,以这个box为基础模板,打造vagrant环境,启动vagrant报错 angel:vagrant $ vagrant up Bringing machi ...
- windows下apache服务器开启压缩和网页缓存
找到配置文件:http.conf apache开启压缩 一.开启配置,去除下面代码前面的#号LoadModule deflate_module modules/mod_deflate.soLoadMo ...
- web自动化一(selenium+python+pycharm环境搭建)
年前公司刚刚搭起了web自动化测试框架的环境,趁着过完年还没全部忘掉,准备把如何搭建环境的方法和大家分享下,有哪里不对的地方,请批评指正,共同进步,共勉! 为此我把搭建环境所需的软件打包上传到百度云, ...
- OO(Object Oriented)
封装.继承.多态. 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别.封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的代码进行有 ...
- 又是一个愚蠢的错误,皆因.xml而起
论java中的.xml到底有多坑?! 感觉自己都快哭了,再一次被.xml给坑了一下,这次坑的太狠了,一下子导致自己浪费了昨天一下午,一晚上,今天一上午和半个下午呀,中间的过程真的是乏善可陈呀,各 ...
- ElasticSearch 5.0.0 集群安装部署文档
1. 搭建环境 3台物理机 操作系统 centos7 es1 192.168.31.141 4g内存 2核 es2 192.168.31.142 4g内存 2核 es3 ...
- UVA - 1592 Database 枚举+map
思路 直接枚举两列,然后枚举每一行用map依次记录每对字符串出现的是否出现过(字符串最好先处理成数字,这样会更快),如果出现就是"NO",否则就是"YES". ...
- CentOS6实现路由器功能
网络之间的通信主要是依靠路由器,当然生成环境中是拥有路由器的,但是系统中的路由配置也是需要了解一下地,今天讲解一下在CentOS6环境下搭建路由器,此乃入门级的简单实验.拓扑如上图已经规划好,暂且使用 ...
- 99%的人理解错 HTTP 中 GET 与 POST 的区别
转自:http://www.oschina.net/news/77354/http-get-post-different GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发 ...
- 如何在模拟器里体验微软HoloLens
众所周知,微软的HoloLens以及MR设备售价都比较高,这让不少感兴趣的朋友们望而却步,本篇教程将向大家介绍如何在模拟器里体验传说中的HoloLens. 1.需要准备的硬件: 智能手机一台(WP.A ...