BZOJ1018线段树
1018: [SHOI2008]堵塞的交通traffic
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 3489 Solved: 1168
[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
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
Sample Output
N
HINT
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- const int maxn=+;
- char s[];
- int x1,x2,y1,y2,c;
- struct Segtree{
- struct Status{
- int a1[][],a2[];
- }s[maxn];
- bool b[maxn][];
- int l[maxn],r[maxn],m[maxn];
- Status update(Status s1,Status s2,bool b[]) {
- Status res;
- for(int i=;i<=;++i)
- for(int j=;j<=;++j)
- res.a1[i][j]=(s1.a1[i][]&&b[]&&s2.a1[][j])||(s1.a1[i][]&&b[]&&s2.a1[][j]);
- res.a2[]=(s1.a2[])||(s1.a1[][]&&b[]&&s2.a2[]&&b[]&&s1.a1[][]);
- res.a2[]=(s2.a2[])||(s2.a1[][]&&b[]&&s1.a2[]&&b[]&&s2.a1[][]);
- return res;
- }
- Status access(int x,int y1,int y2){
- if(y1<=l[x]&&r[x]<=y2) return s[x];
- else if(y2<=m[x]) return access(x<<,y1,y2);
- else if(y1>m[x]) return access(x<<|,y1,y2);
- else return update(access(x<<,y1,y2),access(x<<|,y1,y2),b[x]);
- }
- void change(bool k,int x,int x1,int y1,int x2,int y2){
- if(x1==x2&&y1==m[x]) {
- b[x][x1]=k;
- s[x]=update(s[x<<],s[x<<|],b[x]);
- }
- else if(l[x]==r[x]) s[x].a1[][]=s[x].a1[][]=s[x].a2[]=s[x].a2[]=k;
- else {
- change(k,y2<=m[x]?x<<:x<<|,x1,y1,x2,y2);
- s[x]=update(s[x<<],s[x<<|],b[x]);
- }
- }
- void ask(int x1,int y1,int x2,int y2){
- Status left=access(,,y1),right=access(,y2,c),mid=access(,y1,y2);
- bool res=false;
- for(int i=;i<=;++i)
- for(int j=;j<=;++j)
- if(mid.a1[i][j]&&(i==x1||left.a2[])&&(j==x2||right.a2[])) {
- res=true;
- break;
- }
- if(res) puts("Y"); else puts("N");
- }
- void build(int x,int y1,int y2){
- l[x]=y1,r[x]=y2,m[x]=(l[x]+r[x])>>;
- if(y1==y2) s[x].a1[][]=s[x].a1[][]=true;
- else {
- build(x<<,y1,m[x]);
- build(x<<|,m[x]+,y2);
- }
- }
- }seg;
- int main(){
- scanf("%d",&c);
- seg.build(,,c);
- while(){
- scanf("%s",s);
- if(s[]=='E') break;
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
- --x1;--x2;
- if(y1>y2) {
- swap(x1,x2);
- swap(y1,y2);
- }
- if(s[]=='O') seg.change(,,x1,y1,x2,y2);
- else if(s[]=='C') seg.change(,,x1,y1,x2,y2);
- else seg.ask(x1,y1,x2,y2);
- }
- return ;
- }
BZOJ1018线段树的更多相关文章
- 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic
线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...
- 【BZOJ1018】堵塞的交通(线段树)
[BZOJ1018]堵塞的交通(线段树) 题面 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网 ...
- BZOJ1018 SHOI2008堵塞的交通(线段树)
动态图的连通性当然是可以用LCT维护的.但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢. 考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径 ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
- BZOJ1018[SHOI2008]堵塞的交通——线段树
题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...
- bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
随机推荐
- Elasticsearch: 权威指南 » 深入搜索 » 多字段搜索 » 多数字段 good
跨字段实体搜索 » 多数字段编辑 全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 --返回所有的相关文档:精确率 --不返回无关文档.目的是在结果的 ...
- 【ElasticSearch学习】之一图读懂文档索引全过程
ES索引过程详解: 1.客户端发送索引请求. 客户端向ES节点发送索引请求,以RestClient客户端发起请求为例: ES提供了Java High Level REST Client,用户可以通过R ...
- 让pomelo可以获取到反向代理websockets的真实用户IP
/node_modules/pomelo/lib/connectors/hybridsocket.js 找到 var Socket = function(id, socket) { 给remoteAd ...
- 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...
- Codeforces Round #622 (Div. 2) 1313 A
Tired of boring office work, Denis decided to open a fast food restaurant. On the first day he made ...
- Python网络数据采集- 创建爬虫
1. 初见网络爬虫 1.1 网络连接 输出某个网页的全部 HTML 代码. urllib 是 Python 的标准库(就是说你不用额外安装就可以运行这个例子),包含了从网络请求数据,处理 cookie ...
- 《Docker从入门到跑路》之基本用法介绍
Docker是一种轻量级的虚拟化技术,它具备传统虚拟机无法比拟的优势,它更简易的安装和使用方式.更快的速度.服务集成和开源流程自动化. Docker的安装 安装Docker的基本要素:1.Docker ...
- linux进程管理相关命令
ps ps aux ps -ef | grep -E "supervisor|PPID" top 可以按一定规则对top的结果进行排序 # 监控单一进程 top -p pid ...
- Q - Play With Sequence HDU - 3971 线段树 重新排序建树
Q - Play With Sequence HDU - 3971 这个题目是一个线段树,比较特别的线段树,就是c询问一定次数之后重新排序建树来优化减低复杂度. 第一次碰到这种题目有点迷. 这个题目写 ...
- 在Maven项目中添加代码目录下的配置文件
问题 Maven 是约定大于配置的一种工具, 通常约定在 src/main/resources 目录下放配置文件, 当我们想要在 src/main/java 代码目录下放置配置文件用来测试, Mave ...