洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通
【题解】
原来线段树还可以这么玩。。
我们用线段树维护连通性。对于一个矩形,我们用4个标记维护4个点的联通情况,再用两个标记维护右边两个点与它们右边的与它们在同一行的点的联通情况。
画图表示,就是
另一个关键问题是对于询问(r1,c1,r2,c2),并不是只可以走c1到c2之间的部分,它可以绕路走,这就需要我们在处理询问的时候把c1,c2进行扩展。具体说来,就是让c1一直向左走,让c2一直向右走,
然后查询新的(r1,c1,r2,c2). 为什么这样做是对的呢?
通过上图我们可以发现要绕路走必须走到跟r1,r2不同的行,也就是一定会通过c1左边的竖着的边以及c2右边的竖着的边。而且一定存在一种走法使得绕路走的部分形成一个类似括号的形状。我们把c1一直左移得到c1',就可以保证[c1',c1]之间一定有竖着的边(如果c1到c1左边联通的部分之间有竖边存在的话)。右边的c2也是同理。这样查询新的c1,c2就转化成了没有绕路走的情况。
- // luogu-judger-enable-o2
- #include<cstdio>
- #include<algorithm>
- #define N 100010
- #define rg register
- #define ls (u<<1)
- #define rs (u<<1|1)
- using namespace std;
- int n;
- struct tree{
- int t1,t2,t3,t4,t5,t6;
- }a[N<<];
- inline int read(){
- int k=,f=; char c=getchar();
- while(c<''||c>'')c=='-'&&(f=-),c=getchar();
- while(''<=c&&c<='')k=k*+c-'',c=getchar();
- return k*f;
- }
- inline void pushup(int u){
- a[u].t1=(a[ls].t1&&a[ls].t5&&a[rs].t1)||(a[ls].t3&&a[ls].t6&&a[rs].t4);
- a[u].t2=(a[ls].t2&&a[ls].t6&&a[rs].t2)||(a[ls].t4&&a[ls].t5&&a[rs].t3);
- a[u].t3=(a[ls].t1&&a[ls].t5&&a[rs].t3)||(a[ls].t3&&a[ls].t6&&a[rs].t2);
- a[u].t4=(a[ls].t4&&a[ls].t5&&a[rs].t1)||(a[ls].t2&&a[ls].t6&&a[rs].t4);
- a[u].t5=a[rs].t5;
- a[u].t6=a[rs].t6;
- }
- void build(int u,int l,int r){
- if(l<r){
- int mid=(l+r)>>;
- build(ls,l,mid); build(rs,mid+,r);
- }
- else a[u].t1=a[u].t2=;
- }
- void update(int u,int l,int r,int pos,int type,int del){
- if(l==r){
- if(type==||type==) a[u].t3=a[u].t4=del;
- if(type==) a[u].t5=del;
- if(type==) a[u].t6=del;
- return;
- }
- int mid=(l+r)>>;
- if(pos<=mid) update(ls,l,mid,pos,type,del);
- else update(rs,mid+,r,pos,type,del);
- pushup(u);
- }
- tree query(int u,int l,int r,int ql,int qr){
- if(ql<=l&&r<=qr) return a[u];
- tree ret,L,R; int mid=(l+r)>>;
- L=R=(tree){,,,,,};
- if(ql<=mid) ret=L=query(ls,l,mid,ql,qr);
- if(qr>mid) ret=R=query(rs,mid+,r,ql,qr);
- if(ql<=mid&&qr>mid){
- ret.t1=(L.t1&&L.t5&&R.t1)||(L.t3&&L.t6&&R.t4);
- ret.t2=(L.t2&&L.t6&&R.t2)||(L.t4&&L.t5&&R.t3);
- ret.t3=(L.t1&&L.t5&&R.t3)||(L.t3&&L.t6&&R.t2);
- ret.t4=(L.t4&&L.t5&&R.t1)||(L.t2&&L.t6&&R.t4);
- }
- return ret;
- }
- int goleft(int u,int l,int r,int type,int pos){
- if(r==pos&&((type==&&a[u].t1)||(type==&&a[u].t2))) return l;
- int mid=(l+r)>>;
- if(pos<=mid) return goleft(ls,l,mid,type,pos);
- int L=goleft(rs,mid+,r,type,pos);
- if(L==mid+&&((type==&&a[ls].t5)||(type==&&a[ls].t6)))
- return goleft(ls,l,mid,type,mid);
- return L;
- }
- int goright(int u,int l,int r,int type,int pos){
- if(l==pos&&((type==&&a[u].t1)||(type==&&a[u].t2))) return r;
- int mid=(l+r)>>;
- if(pos>mid) return goright(rs,mid+,r,type,pos);
- int R=goright(ls,l,mid,type,pos);
- if(R==mid&&((type==&&a[ls].t5)||(type==&&a[ls].t6)))
- return goright(rs,mid+,r,type,mid+);
- return R;
- }
- int main(){
- n=read(); build(,,n);
- while(){
- char s[]; scanf("%s",s+);
- while(s[]!='E'&&s[]!='C'&&s[]!='O'&&s[]!='A') scanf("%s",s+);
- if(s[]=='E') break;
- int r1=read(),c1=read(),r2=read(),c2=read();
- if(c1>c2) swap(c1,c2),swap(r1,r2);
- if(s[]=='C'){
- if(c1==c2) update(,,n,c1,,);
- if(r1==r2) update(,,n,c1,r1==?:,);
- }
- if(s[]=='O'){
- if(c1==c2) update(,,n,c1,,);
- if(r1==r2) update(,,n,c1,r1==?:,);
- }
- if(s[]=='A'){
- c1=goleft(,,n,r1,c1); c2=goright(,,n,r2,c2);
- tree ans=query(,,n,c1,c2);
- bool flag=;
- if(r1==&&r2==) flag=ans.t1;
- if(r1==&&r2==) flag=ans.t2;
- if(r1==&&r2==) flag=ans.t3;
- if(r1==&&r2==) flag=ans.t4;
- puts(flag?"Y":"N");
- }
- }
- return ;
- }
洛谷 4246 BZOJ 1018 [SHOI2008]堵塞的交通的更多相关文章
- 数据结构(线段树):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 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...
- 【BZOJ】1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...
随机推荐
- ubuntu 14.04中: 像ubuntu16.04 一样可以在文件夹内打开此路径下的shell
sudo apt-get install nautilus-open-terminal 然后重启 ok!
- 【高德地图API】SDK v1.1.1 在代码中设置Map中心点Center级别不起作用
有时候你在初始化地图时不是直接在xaml中设置Map的Center,而是在cs代码中设置Center或者设置SetZoomAndCenter改变中心点和缩放级别.你可能会发现,不起作用. 这边提出的解 ...
- javascript BOM基本知识
1.BOM(Bowser Object Model浏览器对象模型) 浏览器创建的对象通常称作文档(Document)对象,它是浏览器使用的众多对象的一部分,浏览器操作的对象结合起来称作浏览器对象模型( ...
- Java多线程(六)守护进程
守护进程:当进程中不存在非守护线程了,则守护线程自动销毁: public class DaemonThread extends Thread{ private int i =0; public voi ...
- Agar.io 简单但是有趣的网页游戏
攻略,进阶 上榜第一次 (有点水,九百多分) 上榜第二次 (完成四杀,逆袭上榜) 上榜第三次 (忘写名字,自己补上) 上榜第四次 (人生巅峰!) 上榜第五次 (踩了狗屎运,上榜这么容易了?收了一个小 ...
- 二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
题目传送门 /* 题意:问有几个区间最大值-最小值 < k 解法1:枚举左端点,二分右端点,用RMQ(或树状数组)求区间最值,O(nlog(n))复杂度 解法2:用单调队列维护最值,O(n)复杂 ...
- 题解报告:poj 1321 棋盘问题(dfs)
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- ACM_完全背包
背包3 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n种(每一种有无数个)重量和价值分别为Wi,Vi的物品,现从这些物品中挑 ...
- PowerDesigner连接Oracle数据库(32位)反向生成物理数据模型
PowerDesigner可以连接Oracle数据库进行反向生成物理数据模型,本文演示操作过程. 环境说明: 1)Windows8.1,Oracle11R2 32位. 2)PowerDesigner1 ...
- 转 MySQL数据库基础
http://lib.csdn.net/article/mysql/57883 1 数据库基础 一.数据库与数据库管理系统 1.数据库(DB):存放数据的仓库,从广义来说,数据不仅包括数字,还包括了文 ...