1018: [SHOI2008]堵塞的交通traffic

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 2887  Solved: 954
[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
 
 
 
一道很恶心的线段树维护区间连通性(蒟蒻这才知道线段树可以干这个),不知道怎么维护的看我代码。
注意细节,整整调试了1天才A掉。
 
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
const int MAXN=;
struct node
{
bool luru,lurd,luld,rurd,ldru,ldrd;
}tr[MAXN*];
char ch[];
int n,k,v,limleft,limright,toright[][MAXN];
inline int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
void build(int p,int l,int r)
{
if(l>r) return;
if(l==r)
{
tr[p].luru=tr[p].ldrd=;
return;
}
int mid=(l+r)/;
build(p*,l,mid);
build(p*+,mid+,r);
}
node merge(node a,node b,int upedge,int downedge)
{
node c;
c.luld=a.luld; c.rurd=b.rurd;
c.luru=(a.luru&upedge&b.luru)|(a.lurd&downedge&b.ldru);
c.ldrd=(a.ldrd&downedge&b.ldrd)|(a.ldru&upedge&b.lurd);
c.lurd=(c.luru&c.rurd)|(c.luld&c.ldrd)|(a.luru&upedge&b.lurd)|(a.lurd&downedge&b.ldrd);
c.ldru=(c.luld&c.luru)|(c.ldrd&c.rurd)|(a.ldru&upedge&b.luru)|(a.ldrd&downedge&b.ldru);
c.luld=c.luld|(c.lurd&c.ldrd)|(c.ldru&c.luru)|(a.luru&upedge&b.luld&downedge&a.ldrd);
c.rurd=c.rurd|(c.lurd&c.luru)|(c.ldru&c.ldrd)|(b.luru&upedge&a.rurd&downedge&b.ldrd);
return c;
}
void updata1(int p,int l,int r)
{
if(l>k||r<k) return;
if(l==k&&r==k)
{
tr[p].luld=tr[p].rurd=tr[p].lurd=tr[p].ldru=v;
return;
}
int mid=(l+r)/;
updata1(p*,l,mid);
updata1(p*+,mid+,r);
tr[p]=merge(tr[p*],tr[p*+],toright[][mid],toright[][mid]);
}
void updata2(int p,int l,int r)
{
if(l>k||r<k) return;
if(l==k&&r==k) return;
int mid=(l+r)/;
updata2(p*,l,mid);
updata2(p*+,mid+,r);
tr[p]=merge(tr[p*],tr[p*+],toright[][mid],toright[][mid]);
}
node get(int p,int l,int r)
{
node a,b,c;
if(l>=limleft&&r<=limright) return tr[p];
int mid=(l+r)/;
if(mid+<=limleft) return get(p*+,mid+,r);
else if(limright<=mid) return get(p*,l,mid);
else
{
a=get(p*,l,mid);
b=get(p*+,mid+,r);
c=merge(a,b,toright[][mid],toright[][mid]);
}
return c;
}
int main()
{
//freopen("bzoj_1018.in","r",stdin);
//freopen("bzoj_1018.out","w",stdout);
n=read();
build(,,n);
while(scanf("%s",ch+))
{
if(ch[]=='E') break;
if(ch[]=='O')
{
int x1=read(),y1=read(),x2=read(),y2=read();
if(y1==y2&&x1!=x2)
{
k=y1; v=;
updata1(,,n);
}
if(x1==x2&&y1!=y2)
{
y1=min(y1,y2); k=y1;
toright[x1-][y1]=; updata2(,,n);
}
}
if(ch[]=='C')
{
int x1=read(),y1=read(),x2=read(),y2=read();
if(y1>y2) {swap(x1,x2); swap(y1,y2);}
if(y1==y2&&x1!=x2)
{
k=y1; v=;
updata1(,,n);
}
if(x1==x2&&y1!=y2)
{
y1=min(y1,y2); k=y1;
toright[x1-][y1]=; updata2(,,n);
}
}
if(ch[]=='A')
{
int x1=read(),y1=read(),x2=read(),y2=read();
if(x1==x2&&y1==y2) printf("Y\n");
if(y1>y2) {swap(x1,x2); swap(y1,y2);}
limleft=; limright=y1; node Left=get(,,n);
limleft=y1; limright=y2; node Mid=get(,,n);
limleft=y2; limright=n; node Right=get(,,n);
if(y1==y2&&x1!=x2)
{
if(Left.rurd||Mid.luld||Right.luld) printf("Y\n");
else printf("N\n");
}
if(x1==x2&&y1!=y2)
{
if(x1==)
{
if((Left.rurd&&Mid.ldrd&&Right.luld)||Mid.luru||(Left.rurd&&Mid.ldru)||(Mid.lurd&&Right.luld)) printf("Y\n");
else printf("N\n");
}
else
{
if((Left.rurd&&Mid.luru&&Right.luld)||Mid.ldrd||(Left.rurd&&Mid.lurd)||(Mid.ldru&&Right.luld)) printf("Y\n");
else printf("N\n");
}
}
if(x1!=x2&&y1!=y2)
{
if(x1==)
{
if((Left.rurd&&Mid.ldru&&Right.luld)||Mid.lurd||(Left.rurd&&Mid.ldrd)||(Mid.luru&&Right.luld)) printf("Y\n");
else printf("N\n");
}
else
{
if((Left.rurd&&Mid.lurd&&Right.luld)||Mid.ldru||(Left.rurd&&Mid.luru)||(Mid.ldrd&&Right.luld)) printf("Y\n");
else printf("N\n");
}
}
}
}
return ;
}
 
 
 
 

【bzoj1018】[SHOI2008]堵塞的交通traffic的更多相关文章

  1. bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树

    [BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...

随机推荐

  1. Leetcode 912. Sort an Array

    class Solution: def sortArray(self, nums: List[int]) -> List[int]: return sorted(nums)

  2. rebar自定义template

    在开发过程中rebar自带模板建立项目,或多或少不能满足自己的开发需求.本人又是那种懒人,所以就要想办法偷懒.查看了priv模板 打造适合自己的项目模板.下面我简单的介绍整个模板的打造过程. 准备过程 ...

  3. FZU Problem 2129 子序列个数

    看了 dp 方程之后应该是妙懂 每次 加入一个数,×2  然后剪掉重复的: 重复的个数 维前面那个数,,,,, #include<iostream> #include<stdio.h ...

  4. HDU - 6268: Master of Subgraph (分治+bitset优化背包)

    题意:T组样例,给次给出一个N节点的点权树,以及M,问连通块的点权和sum的情况,输出sum=1到M,用0或者1表示. 思路:背包,N^2,由于是无向的连通块,所以可以用分治优化到NlgN. 然后背包 ...

  5. 一起来看CORE源码(一) ConcurrentDictionary

    先贴源码地址 https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Col ...

  6. TortoiseGit不同分支合并代码2

    现在有主分支master和分支day2.现在要把day2上的变更合并到主分支master上! 1.首先切换到目标分支master上. 说明当前分支是master分支. 2.在master分支上查看提交 ...

  7. Xcode 打开playground文件的时候提示-Unable to find execution service for selected run destination

    解决办法: step 1: 关闭Xcode (快捷键cmd + q) step 2:在terminal里面运行如下语句 rm -rf ~/Library/Developer/CoreSimulator ...

  8. Asp.Net构架(Http请求处理流程) - Part.1

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...

  9. 5 数组 Swift/Object-C ——《Swift3.0从入门到出家》

    Swift中数组是一种数据结构,用来存放多个形同类型的数据结构,数据在数组内的存放是有序的,存进来的数据个读出来的顺序相同 Object-C 中数组能够存放任意类型的数据类型为[AnyObject] ...

  10. Android中内容观察者的使用---- ContentObserver类详解 (转)

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...