BZOJ 1018 堵塞的交通traffic(线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1018
题意:一个2*n的格子,相邻格子之间有一条道路。初始时道路是不通的。 三种操作:(1)某条道路连起来;(2)某条道路断开;(3)询问某两个格子是否相连。
思路:(1)首先,线段树的节点保存[L,R]区间两端的四个格子的连通情况,共六种,另外还要保存[L,mid],[mid+1,R]这两段之间的连通情况,即格子(1,mid)和(1,mid+1)以及(2,mid)和(2,mid+1)是否连接;
(2)查询[L,R]时,有可能L直接与R相连,也有可能L向前走再回来,或者R向后走再回来。查询p=[1,L],r=[L,R],q=[R,n]。那么p的右侧两个格子相连或者r的左侧两个格子相连,则r的左侧两个格子相连;q的左侧两个格子相连或者r的右侧两个格子相连,则r的右侧两个格子相连。此时利用r的四个格子的连通情况就可以判断询问的两个格子是否连通。
(3)修改时,x1=x2,则两个格子为同一行相邻格子,否则为同一列的两个格子。
struct Node
{
int lb,rb,b[2][2];
};
struct node
{
int b0,b1,L,R,mid;
Node b;
};
node a[N<<2];
Node merge(Node a,Node b,int b0,int b1)
{
Node ans;
ans.lb=a.lb||(a.b[0][0]&&b0&&b.lb&&b1&&a.b[1][1]);
ans.rb=b.rb||(b.b[0][0]&&b0&&a.rb&&b1&&b.b[1][1]);
clr(ans.b,0);
int i,j;
if(b0) FOR0(i,2) FOR0(j,2) ans.b[i][j]|=a.b[i][0]&&b.b[0][j];
if(b1) FOR0(i,2) FOR0(j,2) ans.b[i][j]|=a.b[i][1]&&b.b[1][j];
return ans;
}
void build(int t,int L,int R)
{
a[t].L=L;
a[t].R=R;
a[t].mid=(L+R)>>1;
if(L==R)
{
a[t].b.b[0][0]=a[t].b.b[1][1]=1;
return;
}
build(t*2,L,a[t].mid);
build(t*2+1,a[t].mid+1,R);
}
void update(int t,int x1,int y1,int x2,int y2,int b)
{
if(x1==x2&&a[t].mid==y1)
{
if(x1==0) a[t].b0=b;
else a[t].b1=b;
a[t].b=merge(a[t*2].b,a[t*2+1].b,a[t].b0,a[t].b1);
return;
}
if(a[t].L==a[t].R)
{
a[t].b.lb=a[t].b.rb=a[t].b.b[0][1]=a[t].b.b[1][0]=b;
return;
}
if(y1<=a[t].mid) update(t*2,x1,y1,x2,y2,b);
else update(t*2+1,x1,y1,x2,y2,b);
a[t].b=merge(a[t*2].b,a[t*2+1].b,a[t].b0,a[t].b1);
}
Node query(int t,int L,int R)
{
if(a[t].L==L&&a[t].R==R) return a[t].b;
if(R<=a[t].mid) return query(t*2,L,R);
if(L>a[t].mid) return query(t*2+1,L,R);
Node p=query(t*2,L,a[t].mid);
Node q=query(t*2+1,a[t].mid+1,R);
return merge(p,q,a[t].b0,a[t].b1);
}
int n;
int main()
{
RD(n); build(1,1,n);
char op[10];
int x1,y1,x2,y2;
Node p,q,r;
int i,j,ans;
while(scanf("%s",op),op[0]!='E')
{
RD(x1,y1); RD(x2,y2); x1--; x2--;
if(y1>y2) swap(y1,y2),swap(x1,x2);
if(op[0]=='C') update(1,x1,y1,x2,y2,0);
else if(op[0]=='O') update(1,x1,y1,x2,y2,1);
else
{
p=query(1,1,y1);
q=query(1,y2,n);
r=query(1,y1,y2);
if(p.rb) r.lb=1;
if(q.lb) r.rb=1;
ans=0;
FOR0(i,2) FOR0(j,2) if(r.b[i][j])
{
if((i==x1||r.lb)&&(j==x2||r.rb)) ans=1;
}
if(ans) puts("Y");
else puts("N");
}
}
}
BZOJ 1018 堵塞的交通traffic(线段树)的更多相关文章
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- [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(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set
题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
- Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
- 【BZOJ1018】堵塞的交通(线段树)
[BZOJ1018]堵塞的交通(线段树) 题面 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网 ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
随机推荐
- IE 选择文字后 显示小箭头 加速按钮
IE - 工具 - Internet选项 - 高级 - 不选择<在选择是显示加速按钮>选项就可以了.
- 13test07;字符排序,去重,三三输出
#include<iostream> #include<string> using namespace std; void buddle(char*,int);//对输入字符的 ...
- Codeforces 414C Mashmokh and Reverse Operation
题意:给你2^n个数,每次操作将其分成2^k份,对于每一份内部的数进行翻转,每次操作完后输出操作后的2^n个数的逆序数. 解法:2^n个数,可以联想到建立一棵二叉树的东西,比如 2,1,4,3就可以 ...
- POJ 2591 1338 2545 2247(数列递归衍生问题,思路挺妙)
四道题的难度: 2591<1338<2545<2247 POJ 2591 Set Definition: 这是从discuss里看来的,写的挺好,直接copy,根据我的代码稍有改动( ...
- HDU 1260 Tickets(简单dp)
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- .NET Framework 框架简述01
NET技术可以以规范和实现两部分来划分. 规范: 公共语言架构(Common Language Infrastructure, CLI),主要包括 1.通用类型系统(Common Type S ...
- Python 爬虫过程中的中文乱码问题
python+mongodb 在爬虫的过程中,抓到一个中文字段,encode和decode都无法正确显示 注:以下print均是在mongodb中截图显示的,在pythonshell中可能会有所不同 ...
- Java IO(三)
File File类的常见方法: 1.创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文 ...
- redhat6修改主机名
1.临时修改主机名 sudo hostname lyhost 2.永久修改主机名 vim /etc/sysconfig/network 修改里面的hostname字段即可,重启后生效.
- malloc/free 和 new/delete 的区别
1.malloc在C和C++中的区别 1.1.C中可以将任意的指针赋值给void*类型的变量.也可以将void*类型的值赋值给通常的指针变量. ---------------------------- ...