题目链接: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 【线段树维护联通性】的更多相关文章

  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(线段树分治+并查集)

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

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

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

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

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

  5. 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Descri ...

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

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

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

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

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

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

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

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

随机推荐

  1. android 59 LinearLayout 线性布局

    ##常见的布局* LinearLayout 线性布局线性布局往左右拉是拉不动的,> 线性布局的朝向 vertical|horizontal> 线性布局的权重 weight 和 0dip一起 ...

  2. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  3. android开发之bitmap使用

    bitmap是android中重要的图像处理工具类,通过bitmap可以对图像进行剪切.旋转.缩放等操作,同时还可以指定格式和压缩质量保存图像文件. 一.拿到一个Bitmap对象 查看源码我们知道,B ...

  4. Oracle11g新特性导致空表不能导出问题

        ORACLE 11G在用EXP导出时,发现空表(没有数据或者没有用过的表)不能导出了.     查了一下资料,说是Oracle 11G中有个新特性,当表无数据时,不分配segment,以节省空 ...

  5. WisDom.Net 框架设计(七) 验证框架

    WisDom.Net-验证框架 1.分类 这里我们将数据验证分为以下几种 数据类型校验      主要用于确保数据类型输入的正确  比如年龄一项输入 A岁 ,显然不合法 域检查             ...

  6. 浅谈C#关于AOP编程的学习总结

    难得在这样一个节日里给写出一篇博客,却没有佳人相约,没办法,这就是一个程(dan)序(shen)猿(gou)的真实生活情景,每天除了coding还是coding.唉..污染各位看官的眼了.好吧,进入正 ...

  7. <artifactId>maven-compiler-plugin</artifactId>

    根据名字就可以看出来,就是控制编译环境的 <plugin>            <groupId>org.apache.maven.plugins</groupId&g ...

  8. 利用查询提示优化SQL

    数据库环境:SQL SERVER 2005 我们来看一下SQL语句及对应的数据量 SELECT COUNT(*) FROM cinvout_02 a WHERE ( a.dept_id IN ( SE ...

  9. C#常用的关键字

    常用关键字有 this 1)当前类的对象 2)调用自己的构造函数 new base virtual interface abstract override parttial sealed return ...

  10. C#一些小技巧(二)

    教你们怎么改配色方案,因为本人智障了很久,每次想改颜色的时候都会看到一大圈的选项,难以琢磨,但是智障了那么久终于被我找到了所有的关联. 首先,要告诉你们的是,其实C#里面要改的东西只有那么几个,但是注 ...