[BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018
题目分析
这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题..
这道题是线段树维护联通性的经典模型。
我们线段树的一个节点表示一个区间的联通性,有 6 个 bool 值,表示这个区间的 4 个角上的点之间的联通性。
然后用两个子区间的联通性和两个子区间之间的连边情况合并出整个区间的联通性。
修改某条边时,先在边的数组中修改,然后从这条边所在的点的线段树叶子开始向上 Update 。
询问两点之间的联通性时,假如它们的列分别是 y1, y2, 那么我们要求出 [1, y1] [y1, y2] [y2, n] 的联通性。
然后用这三个联通性组合起来手动枚举各种情况判断两个点是否联通。
因为分别处于 y1, y2 的两个点,之间可能不只是通过 [y1, y2] 之间的边联通,而是需要用到两侧的边连接起来。
代码
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- inline int gmin(int a, int b) {return a < b ? a : b;}
- inline int gmax(int a, int b) {return a > b ? a : b;}
- const int MaxN = 100000 + 5;
- int n;
- char Str[15];
- bool A[MaxN][3];
- struct ES
- {
- bool a1, a2, b1, b2, c1, c2;
- } T[MaxN * 4];
- inline ES Plus(ES e1, ES e2, int m)
- {
- ES ret;
- ret.a1 = e1.a1 || (e1.b1 && e1.b2 && A[m][1] && A[m][2] && e2.a1);
- ret.a2 = e2.a2 || (e2.b1 && e2.b2 && A[m][1] && A[m][2] && e1.a2);
- ret.b1 = (e1.b1 && A[m][1] && e2.b1) || (e1.c1 && A[m][2] && e2.c2);
- ret.b2 = (e1.b2 && A[m][2] && e2.b2) || (e1.c2 && A[m][1] && e2.c1);
- ret.c1 = (e1.b1 && A[m][1] && e2.c1) || (e1.c1 && A[m][2] && e2.b2);
- ret.c2 = (e1.b2 && A[m][2] && e2.c2) || (e1.c2 && A[m][1] && e2.b1);
- return ret;
- }
- void Build(int x, int s, int t)
- {
- if (s == t)
- {
- T[x].a1 = T[x].a2 = T[x].c1 = T[x].c2 = false;
- T[x].b1 = T[x].b2 = true;
- return;
- }
- int m = (s + t) >> 1;
- Build(x << 1, s, m);
- Build(x << 1 | 1, m + 1, t);
- T[x] = Plus(T[x << 1], T[x << 1 | 1], m);
- }
- void Modify(int x, int s, int t, int Pos)
- {
- if (s == t)
- {
- T[x].a1 = T[x].a2 = T[x].c1 = T[x].c2 = A[Pos][0];
- T[x].b1 = T[x].b2 = true;
- return;
- }
- int m = (s + t) >> 1;
- if (Pos <= m) Modify(x << 1, s, m, Pos);
- else Modify(x << 1 | 1, m + 1, t, Pos);
- T[x] = Plus(T[x << 1], T[x << 1 | 1], m);
- }
- ES Get(int x, int s, int t, int l, int r)
- {
- if (l <= s && r >= t) return T[x];
- ES ret;
- int m = (s + t) >> 1;
- if (r <= m) ret = Get(x << 1, s, m, l, r);
- else if (l >= m + 1) ret = Get(x << 1 | 1, m + 1, t, l, r);
- else ret = Plus(Get(x << 1, s, m, l, r), Get(x << 1 | 1, m + 1, t, l, r), m);
- return ret;
- }
- int main()
- {
- scanf("%d", &n);
- int x, y, xx, yy;
- bool f, Ans;
- ES El, Ex, Er;
- Build(1, 1, n);
- while (true)
- {
- scanf("%s", Str);
- if (strcmp(Str, "Exit") == 0) break;
- scanf("%d%d%d%d", &x, &y, &xx, &yy);
- if (strcmp(Str, "Ask") == 0)
- {
- if (y > yy)
- {
- swap(x, xx);
- swap(y, yy);
- }
- El = Get(1, 1, n, 1, y);
- Ex = Get(1, 1, n, y, yy);
- Er = Get(1, 1, n, yy, n);
- if (x == xx)
- {
- if (x == 1)
- Ans = Ex.b1 || \
- (A[y - 1][1] && A[y - 1][2] && El.a2 && Ex.c2) || \
- (A[yy][1] && A[yy][2] && Er.a1 && Ex.c1) || \
- (A[y - 1][1] && A[y - 1][2] && El.a2 && A[yy][1] && A[yy][2] && Er.a1 && Ex.b2);
- else
- Ans = Ex.b2 || \
- (A[y - 1][1] && A[y - 1][2] && El.a2 && Ex.c1) || \
- (A[yy][1] && A[yy][2] && Er.a1 && Ex.c2) || \
- (A[y - 1][1] && A[y - 1][2] && El.a2 && A[yy][1] && A[yy][2] && Er.a1 && Ex.b1);
- }
- else
- {
- if (x < xx)
- Ans = Ex.c1 || \
- (A[y - 1][1] && A[y - 1][2] && El.a2 && Ex.b2) || \
- (Ex.b1 && A[yy][1] && A[yy][2] && Er.a1);
- else
- Ans = Ex.c2 || \
- (A[y - 1][1] && A[y - 1][2] && El.a2 && Ex.b1) || \
- (Ex.b2 && A[yy][1] && A[yy][2] && Er.a1);
- }
- if (Ans) printf("Y\n");
- else printf("N\n");
- }
- else
- {
- if (strcmp(Str, "Open") == 0) f = true;
- else f = false;
- if (x == xx)
- {
- A[gmin(y, yy)][x] = f;
- Modify(1, 1, n, gmin(y, yy));
- }
- else
- {
- A[y][0] = f;
- Modify(1, 1, n, y);
- }
- }
- }
- return 0;
- }
[BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】的更多相关文章
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- [SHOI2008]堵塞的交通(线段树维护联通性)
题目 2行c列个点,开始时互不联通,支持给同一列或着同一行相邻的两个点连边,和询问两个点能否在一个联通块里. 1≤C≤100000 1<=操作数<=100000; 题解 线段树的又一个骚操 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 864 Descri ...
- BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2247 Solved: 706[Submit ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
随机推荐
- Android NDK 【错误】The method loadLibrary(String) is undefined for the type Settings.Syste
[错误]The method loadLibrary(String) is undefined for the type Settings.System [解决方法] 不要加入包import andr ...
- SQL Server与Oracle对比学习:权限管理(二) 一些有趣的比喻
http://blog.csdn.net/weiwenhp/article/details/8094739 目录(?)[-] SQL Server权限管理 login 与user的区别 角色role ...
- docker rancher 负载均衡做路由跳转
介绍 我们要实现的目的是 根据负载均衡 跳转到指定的应用容器中 负载均衡中配置好 跳转的地址 当执行URL 请求的时候会自动跳转 测试方法 curl -v --header 'Host:mu.03in ...
- mybatis11 sqlMapConfig.xml文件说明
1sqlMapConfig.xml SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typ ...
- android之listView定位到指定行同时隐藏输入键盘
帮别人该bug遇到的一个问题,记录下来. listView.setSelection(a); 这个方法可以让让你的listview定位到指定行 但是如果紧接着执行隐藏输入键盘的代码,则会有bug,这个 ...
- CentOS 6.7平台Hadoop 1.2.1环境搭建
本教程使用Vultr的VPS搭建,主要实现HDFS和MapReduce两个功能. master.hadoop - 45.32.90.100 slave1.hadoop - 45.32.92.47 sl ...
- HTML5吧
一.为了能使IE9以下的IE浏览器也能支持html5的标签,所以首先得在文档头部用条件注释的方法引入那段著名的代码. 1 2 3 <!--[if lt IE 9]> <script ...
- 第一节 WCF概述
主要内容: 1.什么是WCF? 2.WCF的背景介绍. 引例:(WCF用来解决什么事情) 一家汽车租赁公司决定创建一个新的应用程序,用于汽车预定 • 该租车预定应用程序的创建者知道,应用程序所实现的业 ...
- Web.xml配置详解之context-param (加载spring的xml,然后初始化bean看的)
http://www.cnblogs.com/goody9807/p/4227296.html(很不错啊) 容器先加载spring的xml,然后初始化bean时,会为bean赋值,包括里面的占位符
- iOS与Android通用AES加密
找了很久才成功的aes 加密 服务器java写的 下载地址 https://pan.baidu.com/s/1nvi1zjr