1018: [SHOI2008]堵塞的交通traffic

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 2638  Solved: 864

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”作为结束。我们假设在一开始所有的道路都是堵塞的。 对30%测试数据,我们保证C小于等于1000,信息条数小于等于1000; 对100%测试数据,我们保证 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
 
  思维要缜密啊。
 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
int n;
bool U[maxn],D[maxn],M[maxn];
bool t[maxn<<][];
bool ret[maxn<<][];
void Push_up(int x){
int l=x<<,r=l|;
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=(t[l][]&&t[r][])||(t[l][]&&t[r][]);
t[x][]=t[l][]||(t[l][]&&t[l][]&&t[r][]);
t[x][]=t[r][]||(t[r][]&&t[r][]&&t[l][]);
} void Update(int x,int l,int r,int g){
if(l==r){
t[x][]=U[l]||(M[l]&&D[l]&&M[l+]);
t[x][]=D[l]||(M[l]&&U[l]&&M[l+]);
t[x][]=(M[l]&&D[l])||(U[l]&&M[l+]);
t[x][]=(M[l]&&U[l])||(D[l]&&M[l+]);
t[x][]=M[l]||(M[l+]&&U[l]&&D[l]);
t[x][]=M[l+]||(M[l]&&U[l]&&D[l]);
return;
}
int mid=(l+r)>>;
if(mid>=g)Update(x<<,l,mid,g);
else Update(x<<|,mid+,r,g);
Push_up(x);
}
void Query(int x,int l,int r,int a,int b){
if(l>=a&&r<=b){
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
ret[x][]=t[x][];
return;
}
int mid=(l+r)>>;
if(mid>=a)Query(x<<,l,mid,a,b);
if(mid<b)Query(x<<|,mid+,r,a,b);
if(mid>=a&&mid<b){
int ls=x<<,rs=ls|;
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=(ret[ls][]&&ret[rs][])||(ret[ls][]&&ret[rs][]);
ret[x][]=ret[ls][]||(ret[ls][]&&ret[ls][]&&ret[rs][]);
ret[x][]=ret[rs][]||(ret[rs][]&&ret[rs][]&&ret[ls][]);
}
else{
if(mid>=a){
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
ret[x][]=ret[x<<][];
}
else{
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
ret[x][]=ret[x<<|][];
}
}
}
bool Solve(int x1,int y1,int x2,int y2){
if(y1==y2){
if(x1==x2)return true;
bool re=M[y1];
if(y1<=n){
Query(,,n,y1,n);
re|=ret[][];
}
if(y1>=){
Query(,,n,,y1-);
re|=ret[][];
}
return re;
}
bool t1[],t2[],t3[];
memset(t1,,sizeof(t1));
memset(t3,,sizeof(t3));
if(<=y1-){
Query(,,n,,y1-);
memcpy(t1,ret[],sizeof(ret[]));
}
Query(,,n,y1,y2-);
memcpy(t2,ret[],sizeof(ret[]));
if(y2<=n){
Query(,,n,y2,n);
memcpy(t3,ret[],sizeof(ret[]));
}
if(x1==x2){
if(x1==)
return t2[]||(t1[]&&t2[])||(t3[]&&t2[])||(t1[]&&t2[]&&t3[]);
else
return t2[]||(t1[]&&t2[])||(t3[]&&t2[])||(t1[]&&t2[]&&t3[]);
}
else{
if(x1==)
return t2[]||(t1[]&&t2[])||(t3[]&&t2[]);
else
return t2[]||(t1[]&&t2[])||(t3[]&&t2[]);
}
} int main(){
freopen("traffic.in","r",stdin);
freopen("traffic.out","w",stdout);
int x1,y1,x2,y2;
char op[];
scanf("%d",&n);n--;
while(true){
scanf("%s",op);
if(!strcmp(op,"Exit"))break;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(y1>y2){swap(x1,x2);swap(y1,y2);}
if(!strcmp(op,"Close")){
if(x1==x2)
if(x1==)U[y1]=false;
else D[y1]=false;
else M[y1]=false;
Update(,,n,y1);
if(y1!=y2)Update(,,n,y2);
if(y1-)Update(,,n,y1-);
}
else if(!strcmp(op,"Open")){
if(x1==x2)
if(x1==)
U[y1]=true;
else
D[y1]=true;
else
M[y1]=true;
Update(,,n,y1);
if(y1!=y2)Update(,,n,y2);
if(y1-)Update(,,n,y1-);
}
else if(!strcmp(op,"Ask"))
printf("%c\n",Solve(x1,y1,x2,y2)?'Y':'N');
}
return ;
}

数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic的更多相关文章

  1. BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

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

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

  3. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

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

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

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

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

  7. 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...

  8. BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)

    题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...

随机推荐

  1. JS快速排序和去重

    JS的快速排序和JS去重在面试的时候问的挺多的.下面是我对快速排序的理解,和快速排序,去重的代码. 1.什么是快速排序? 第一步: 快速排序就是去个中间值,把比中间值小的放在左边设为arrLeft,比 ...

  2. Java-分页实例

    1.PageModel.java package com.javaweb; import java.util.List; public class PageModel<E> { priva ...

  3. C#获取类中所有方法

    var t = typeof(HomeController); //获取所有方法 System.Reflection.MethodInfo[] methods = t.GetMethods(); // ...

  4. sqlserver触发器如何将一个库中的数据插入到另外一个库中

    需求:实现的功能就是,查询当前表的所有信息,插入到另外一个库中(同一台机器,同一个SqlServer) 解决:insert into dB2.dbo.TB2 select * from db1.dbo ...

  5. oracle中获取特定时间的前一天

    select to_char(to_date('@rq','YYYY-MM-DD')-1,'YYYY-MM-DD') FROM DUAL 把@rq换成你要的时间就行了

  6. Alljoyn 概述(2)

    AllJoyn 基本概念 • 总线(Bus) – 实现P2P通信的基础 – AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus • 总线附件(Bus Attachment) ...

  7. 嵌入式css样式,写在当前的文件中

    现在有一任务,把下面的“超酷的互联网”.“服务及时贴心”.“有趣易学”这三个短词文字字号修改为18px. 如果用内联式css样式的方法进行设置将是一件很头疼的事情(为每一个<span>标签 ...

  8. javascript基础学习(五)

    javascript之函数 学习要点: 函数的介绍 函数的参数 函数的属性和方法 系统函数 一.函数的介绍 1.函数就是一段javascript代码.可以分为用户自定义函数和系统函数.   如果一个函 ...

  9. 【模板】【网络流】Dinic

    /* 唐代杜荀鹤 <小松> 自小刺头深草里,而今渐觉出蓬蒿. 时人不识凌云木,直待凌云始道高. */ #include <iostream> #include <cstd ...

  10. TaskbarCreated 消息

    托盘中的图片就通过注册这个消息来实现,系统和进程通过进程间通信发送这个消息,进程接收他