bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018
关键点在于只有两行
所以一个2*m矩形连通情况只有6种
编号即对应代码中的a数组
线段树维护
用b数组表示 节点第0/1行的最右一列是否连接了右边
来 辅助 节点的合并
查询
对两个点位于矩形的位置分4种情况讨论
两点是否联通,要考虑四种情况
(以两个位置是矩形左上角和右上角为例)
1、直接联通,线段树的节点包含了这种情况,直接判断
2、
3、
4、
后三种情况需要再查询[1,l]和[r,n]的再合并
边界的处理:
(叶子节点只有一列)
只有一列的状态1和3 全部是true
如果是竖着联通,同时更新状态0和2,4和5
如果是横着联通,
第1行,如果最后一列可以往外合并,更新状态5
第2行,如果最后一列可以往外合并,更新状态4
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define ok { puts("Y"); continue; }
- using namespace std;
- #define N 100001
- int L[N<<],R[N<<];
- struct node
- {
- bool a[],b[];
- void clear() { memset(a,false,sizeof(a)); memset(b,false,sizeof(b)); }
- node operator + (node p) const
- {
- node tmp;
- tmp.clear();
- tmp.a[]=a[];
- tmp.a[]|=a[]&&a[]&&b[]&&b[]&&p.a[];
- // cout<<tmp.a[0];
- tmp.a[]=a[]&&b[]&&p.a[];
- tmp.a[]|=a[]&&b[]&&p.a[];
- // cout<<tmp.a[1];
- tmp.a[]=p.a[];
- tmp.a[]|=p.a[]&&p.a[]&&b[]&&b[]&&a[];
- // cout<<tmp.a[2];
- tmp.a[]=a[]&&b[]&&p.a[];
- tmp.a[]|=a[]&&b[]&&p.a[];
- // cout<<tmp.a[3];
- tmp.a[]=a[]&&b[]&&p.a[];
- tmp.a[]|=a[]&&b[]&&p.a[];
- // cout<<tmp.a[4];
- tmp.a[]=a[]&&b[]&&p.a[];
- tmp.a[]|=a[]&&b[]&&p.a[];
- // cout<<tmp.a[5];
- tmp.b[]=p.b[]; tmp.b[]=p.b[];
- return tmp;
- }
- };
- node tr[N<<];
- void read(int &x)
- {
- x=; char c=getchar();
- while(!isdigit(c)) c=getchar();
- while(isdigit(c)) { x=x*+c-''; c=getchar(); }
- }
- void build(int k,int l,int r)
- {
- L[k]=l; R[k]=r;
- if(l==r)
- {
- tr[k].a[]=tr[k].a[]=true;
- return;
- }
- int mid=l+r>>;
- build(k<<,l,mid);
- build(k<<|,mid+,r);
- }
- void change(int k,int pos,bool ty,int line,bool how)
- {
- if(L[k]==R[k])
- {
- if(!ty)
- {
- if(line==)
- {
- tr[k].b[]=how;
- if(tr[k].b[] && tr[k].a[]) tr[k].a[]=true;
- else if(!tr[k].a[]) tr[k].a[]=false;
- }
- else
- {
- tr[k].b[]=how;
- if(tr[k].b[] && tr[k].a[]) tr[k].a[]=true;
- else if(!tr[k].a[]) tr[k].a[]=false;
- }
- }
- else
- {
- tr[k].a[]=tr[k].a[]=how;
- tr[k].a[]=tr[k].a[]=how;
- }
- return;
- }
- int mid=L[k]+R[k]>>;
- if(pos<=mid) change(k<<,pos,ty,line,how);
- else change(k<<|,pos,ty,line,how);
- tr[k]=tr[k<<]+tr[k<<|];
- }
- node query(int k,int l,int r)
- {
- if(L[k]>=l && R[k]<=r) return tr[k];
- int mid=L[k]+R[k]>>;
- if(r<=mid) return query(k<<,l,r);
- if(l>mid) return query(k<<|,l,r);
- node ll=query(k<<,l,r),rr=query(k<<|,l,r);
- return ll+rr;
- }
- int main()
- {
- // freopen("bzoj_1018.in","r",stdin);
- // freopen("bzoj_1018.out","w",stdout);
- int n; read(n);
- build(,,n);
- char c[];
- int lx,ly,rx,ry;
- int cnt=;
- while(scanf("%s",c)!=EOF)
- {
- if(c[]=='E') return ;
- read(lx); read(ly); read(rx); read(ry);
- if(ly>ry) swap(lx,rx),swap(ly,ry);
- if(c[]=='O' || c[]=='C')
- {
- if(lx==rx) change(,ly,,lx,c[]=='O');
- else change(,ly,,lx,c[]=='O');
- }
- else
- {
- node tmp=query(,ly,ry);
- if(ly==ry && tmp.a[]) ok
- else if(ly!=ry)
- {
- if(lx== && rx== && tmp.a[]) ok
- if(lx== && rx== && tmp.a[]) ok
- if(lx== && rx== && tmp.a[]) ok
- if(lx== && rx== && tmp.a[]) ok
- }
- node l=query(,,ly);
- node r=query(,ry,n);
- if(lx== && rx==)
- {
- if(l.a[]&&tmp.a[]) ok
- if(r.a[]&&tmp.a[]) ok
- if(l.a[]&&r.a[]&&tmp.a[]) ok
- }
- else if(lx== && rx==)
- {
- if(l.a[]&&tmp.a[]) ok
- if(r.a[]&&tmp.a[]) ok
- if(l.a[]&&r.a[]&&tmp.a[]) ok
- }
- else if(lx== && rx==)
- {
- if(l.a[]&&tmp.a[]) ok
- if(r.a[]&&tmp.a[]) ok
- if(l.a[]&&r.a[]&&tmp.a[]) ok
- }
- else
- {
- if(l.a[]&&tmp.a[]) ok
- if(r.a[]&&tmp.a[]) ok
- if(l.a[]&&r.a[]&&tmp.a[]) ok
- }
- puts("N");
- }
- }
- }
1018: [SHOI2008]堵塞的交通traffic
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 3852 Solved: 1265
[Submit][Status][Discuss]
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
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
Sample Output
N
HINT
bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic的更多相关文章
- [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
线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...
- Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树
题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
- BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2247 Solved: 706[Submit ...
随机推荐
- 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)
洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...
- angular+ionic+cordova(实战项目开发中,持续更新自己学到的和遇到的)
最近公司开始准备做app了,大佬选择了angular+ionic+corvoda的开发结构,但是对于刚刚才开始对angular才有一点点感觉的我,就像是被一击闷棍敲了,半天没反应过来,emmm,怎么办 ...
- Hadoop 安装流程
前言:因项目中需要数据分析,因而使用hadoop集群通过离线的方式分析数据 参考着网上的分享的文章实施整合的一篇文章,实施记录 安装流程: 1.设置各个机器建的ssh 无密码登陆 2.安装JDK 3. ...
- EasyUI Parser 解析器
Parser(解析器)应用场景 1,自动调用parser 只要我们书写相应的class,easyui就能成功的渲染页面,这是因为解析器在默认情况下,会在dom加载完成的时候($(docunment). ...
- NOIP2017 总结
联赛结束,但是我并没有得到预期的结果,特写此文分析原因,希望我不会就此退役. 回顾一年,我做了什么? 2016年联赛,我水了两天,抱着挂掉的心态拿到了1=. 2016-2017寒假,参加集训,三天考试 ...
- Java大世界
"java越来越过份了." php狠狠的说,他转头看着C:"C哥,您可是前辈,java最近砸了我不少场子,你老再不出来管管,我怕他眼里就没有您了啊." C哥吸烟 ...
- Linux上部署SVN
Linux上部署SVN author:headsen chen 2017-10-16 16:45:04 前提:通过yum来安装,必须是centos6.5的桌面版的.否则会出现某些的安装包不全而导致 ...
- PHP面试和PHP开发者都应掌握的10个问题
PHP面试和PHP开发者都应掌握的10个问题 问题 :1 MySQL里的存储引擎有什么不同,哪一个是默认的? 答案: 1 我们可以一下存储引擎: 1. MyISAM(MySQL的默认引擎. 每个MyI ...
- Mecanim之IK动画
序言:IK动画全名是Inverse Kinematics 意思是逆向动力学,就是子骨骼节点带动父骨骼节点运动. 比如体操运动员,只靠手来带动身体各个部位的移动.手就是子骨骼,身体就是它的父骨骼,这时运 ...
- 重读 必须知道的.NET
1 .public ,对访问成员无限制,属于访问级别最高的权限. protected 访问包含类或者丛类派生类的类. internal 仅限于程序集, protected inernal 访问仅限于 ...