1018: [SHOI2008]堵塞的交通traffic

Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3795  Solved: 1253 [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
 
 
丧心病狂。
此题用线段树维护联通性。
每个线段树维护第l列至第r列的矩形的四个点相互的连通性。
处理枚举就行
 
 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAXN 100005
using namespace std;
int c;
struct data {
int l1l2,l1r1,l1r2,l2r1,l2r2,r1r2;
int b[];
}t[MAXN*]; data pushup(data lc,data rc) {
data ans;
ans.b[]=rc.b[];ans.b[]=rc.b[];
ans.l1l2=ans.l1r1=ans.l1r2=ans.l2r1=ans.l2r2=ans.r1r2=;
if(lc.l1l2||(lc.l1r1&&lc.b[]&&rc.l1l2&&lc.b[]&&lc.l2r2)) ans.l1l2=;
if(rc.r1r2||(rc.l1r1&&lc.b[]&&lc.r1r2&&lc.b[]&&rc.l2r2)) ans.r1r2=;
if((lc.l1r1&&lc.b[]&&rc.l1r1)||(lc.l1r2&&lc.b[]&&rc.l2r1)) ans.l1r1=;
if((lc.l1r1&&lc.b[]&&rc.l1r2)||(lc.l1r2&&lc.b[]&&rc.l2r2)) ans.l1r2=;
if((lc.l2r1&&lc.b[]&&rc.l1r1)||(lc.l2r2&&lc.b[]&&rc.l2r1)) ans.l2r1=;
if((lc.l2r1&&lc.b[]&&rc.l1r2)||(lc.l2r2&&lc.b[]&&rc.l2r2)) ans.l2r2=;
return ans;
} void build(int l,int r,int o) {
if(l==r){t[o].l1r1=t[o].l2r2=;return;}
int mid=(l+r)>>,lc=o<<,rc=lc+;
build(l,mid,lc);build(mid+,r,rc);
t[o]=pushup(t[lc],t[rc]);
}
int l1,r1,l2,r2;
void update_1(int l,int r,int o,int x,int kind) {
if(l==r){t[o].b[l1]=kind;return;}
int mid=(l+r)>>,lc=o<<,rc=lc+;
if(x<=mid) update_1(l,mid,lc,x,kind);
else update_1(mid+,r,rc,x,kind);
t[o]=pushup(t[lc],t[rc]);
} void update_2(int l,int r,int o,int x,int kind) {
if(l==r){t[o].l1l2=t[o].l2r1=t[o].l1r2=t[o].r1r2=kind;return;}
int mid=(l+r)>>,lc=o<<,rc=lc+;
if(x<=mid) update_2(l,mid,lc,x,kind);
else update_2(mid+,r,rc,x,kind);
t[o]=pushup(t[lc],t[rc]);
}
data query(int l,int r,int o,int L,int R) {
if(L<=l&&R>=r){return t[o];}
int mid=(l+r)>>,lc=o<<,rc=lc+;
if(L>mid) {return query(mid+,r,rc,L,R);}
else if(R<=mid){return query(l,mid,lc,L,R);}
else return pushup(query(l,mid,lc,L,R),query(mid+,r,rc,L,R));
}
bool check() {
data l=query(,c,,,r1);
data r=query(,c,,r2,c);
data now=query(,c,,r1,r2);
if(l1==l2) {
if((l1==)&&(now.l1r1||(now.l1r2&&r.l1l2)||(now.l2r1&&l.r1r2)||(now.l2r2&&l.r1r2&&r.l1l2))) return ;
if((l1==)&&(now.l2r2||(now.l2r1&&r.l1l2)||(now.l1r2&&l.r1r2)||(now.l1r1&&l.r1r2&&r.l1l2))) return ;
}
else {
if((l1==)&&(now.l1r2||(now.l1r1&&r.l1l2)||(now.l2r2&&l.r1r2)||(now.l2r1&&l.r1r2&&r.l1l2))) return ;
if((l1==)&&(now.l2r1||(now.l2r2&&r.l1l2)||(now.l1r1&&l.r1r2)||(now.l1r2&&l.r1r2&&r.l1l2))) return ;
}
return ;
}
int main() {
//freopen("data.in","r",stdin);
//freopen("2.out","w",stdout);
scanf("%d",&c);
build(,c,);
while() {
char ch[];
scanf("%s",ch);
if(ch[]=='O') {
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(r1>r2){swap(l1,l2);swap(r1,r2);}
if(r1!=r2) update_1(,c,,r1,);
else update_2(,c,,r1,);
}
else if(ch[]=='C') {
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(r1>r2){swap(l1,l2);swap(r1,r2);}
if(r1!=r2) update_1(,c,,r1,);
else update_2(,c,,r1,);
}
else if(ch[]=='A') {
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(r1>r2){swap(l1,l2);swap(r1,r2);}
if(check()) printf("Y\n");
else printf("N\n");
}
else return ;
}
}
 

[BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ1018 SHOI2008堵塞的交通(线段树)

    动态图的连通性当然是可以用LCT维护的.但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢. 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径 ...

  7. 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set

    题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...

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

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

  9. [SHOI2008]堵塞的交通(线段树维护联通性)

    题目 2行c列个点,开始时互不联通,支持给同一列或着同一行相邻的两个点连边,和询问两个点能否在一个联通块里. 1≤C≤100000 1<=操作数<=100000; 题解 线段树的又一个骚操 ...

随机推荐

  1. 哪些工具能有效管理Azure Active Directory?

    [TechTarget中国原创] 管理Azure Active Directory有四种常见的工具:Azure Web门户.Azure PowerShell.Azure命令行接口和Azure Mana ...

  2. 使用自己的类来作为hashtable的主键

    import java.util.*; class Counter { } class Groundhog2 { int ghNumber; Groundhog2(int n) { ghNumber ...

  3. 玩转Linux之内存管理-free

    玩转Linux之内存管理-free free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之 ...

  4. CentOS 7.5 部署蓝鲸运维平台

    环境准备 官方建议 准备至少3台 CentOS 7 以上操作系统的机器 最低配置:2核4G 建议配置: 4核12G 以上 部署前关闭待安装主机之间防火墙,保证蓝鲸主机之间通信无碍 部署前关闭SELin ...

  5. 数据库——pymysql模块的使用(13)

    1.基本用法——建立链接,获取游标,执行sql语句,关闭 建立远程链接账号和权限 mysql> grant all on *.* to '; Query OK, rows affected, w ...

  6. Python学习-django-Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 +? 1 2 3 ...

  7. [问题解决]ps aux中command命令相同,如何找出自己要的进程号?

    问题提出: 我们通过ps aux能够查看各个进程的状态,很多时候启动命令相同,我们没有办法判断,我们要查找的进程到底是那个? 我们该用什么方式来找出我们要操作的进程号呢? 解决步骤: 找出有可能的进程 ...

  8. [中山市选2011][bzoj2440] 完全平方数 [二分+莫比乌斯容斥]

    题面 传送门 思路 新姿势get 莫比乌斯容斥 $\sum_{i=1}{n}\mu(i)f(i)$ 这个东西可以把所有没有平方质因子的东西表示出来,还能容斥掉重复的项 证明是根据莫比乌斯函数的定义,显 ...

  9. 《R语言实战》读书笔记--第一章 R语言介绍

    1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...

  10. server reached pm.max_children setting (5), consider raising it

    先查看日志 /data1/server/php-cgi/var/log/php-fpm.log[19-Dec-2012 11:41:13] WARNING: [pool www] server rea ...