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

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

HINT

bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic的更多相关文章

  1. [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3795  Solved: 1253 [Sub ...

  2. BZOJ1018 [SHOI2008]堵塞的交通traffic

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic

    线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...

  4. Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)

    这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...

  5. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  6. [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树

    题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...

  7. bzoj1018[SHOI2008]堵塞的交通traffic——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...

  8. [bzoj1018][SHOI2008]堵塞的交通traffic_线段树

    bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...

  9. BZOJ 1018 [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2247  Solved: 706[Submit ...

随机推荐

  1. 通过分析HSL/HSB获取图片主色调

    这两天稍微研究了一下颜色的HSL/HSB值,主要因为写程序想要实现通过一张图片拿到图片中的最突出的颜色值(类似Groove Music中播放栏背景就是从专辑封面中取出主色调,还有Windows 10任 ...

  2. bzoj2969 矩形粉刷

    学习一波用markdown写题解的姿势QAQ 题意 给你一个w*h的矩形网格,每次随机选择两个点,将以这两个点为顶点的矩形内部的所有小正方形染黑,问染了k次之后期望有多少个黑色格子. 分析 一开始看错 ...

  3. [BZOJ3275] Number (网络流)

    Description 有N个正整数,需要从中选出一些数,使这些数的和最大. 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a*a+b*b=c*c 2:gcd(a,b)=1 ...

  4. 记一次结合PHP多进程和socket.io解决问题的经历

    公司是做棋牌游戏的.前段时间接到一个后台人工鉴定并处理通牌作弊玩家的需求,其中需要根据几个玩家的游戏ID查询并计算他们在某段时间内彼此之间玩牌输赢次数和输赢总额. 牌局数据是存储在日志中心的,他们把牌 ...

  5. 【2016北京集训测试赛】azelso

    [吐槽] 首先当然是要orzyww啦 以及orzyxq奇妙顺推很强qwq 嗯..怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊..(我的妈果然蒟蒻) 这题的话可以说是难 ...

  6. 数据处理框架:Pig

    Pig pig 是基于hadoop的一个数据处理框架. MapReduce是使用java开发的.Pig有一套自己的数据处理语言.Pig的数据处理过程要转化为MR 来运行. Pig的数据处理语言是数据流 ...

  7. 模拟eval

    function eval(fn) { var Fn = Function; return new Fn('return' + fn) (); }

  8. 怎么用secureCRT连接Linux

    首先要安装linux,参看:http://www.cnblogs.com/shenjieblog/p/5061282.html 然后要安装secureCRT,参看:http://www.cnblogs ...

  9. Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...

  10. VS 2017 开发安卓环境搭建 问题总结

    VS 2017可以开发安卓啦,之前一直想尝试开发安卓,但是由于时间忙, Java只学了个基础,不如C#熟练所以一直没有机会接触安卓开发.既然需要利用VS2017开发安卓,那么第一步就是了解VS2017 ...