题目链接: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. spring 整合JDBC

    使用Spring提供的三个JDBC模板类(JdbcTemplate.NamedParameterJdbcTemplate.SimpleJdbcTemplate)操作数据库 一.JdbcTemplate ...

  2. swift Array 数组

    // //  main.Swift //  swift数组 // //  Created by zhangbiao on 14-6-15. //  Copyright (c) 2014年 理想. Al ...

  3. SQL高级优化之经常使用的优化策略-2(The Return Of The King)

    1.2 索引 索引不是越多越好,你须要知道索引建立多了.写入数据的效率会减少.怎样使用索引要看你的项目的应用场景,做出合理的測试评估. 1.2.1 统计数量 统计数量上.假设字段(fieldName) ...

  4. Linux下设置最大文件打开数nofile及nr_open、file-max

    在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“无法打开更多进程”,或是coredump过大等问题,这些都可以设置资源限制来解决.今 ...

  5. 关于XCode5打开工程闪退的一种解决方案

    今天同事遇到一个问题,是关于xcode5打开工程文件一直闪退的问题.后来查看了一下崩溃日志.有如下描述: xception Type: EXC_CRASH (SIGABRT) Exception Co ...

  6. 调试php的soapServer

    用.NET的webservice做调试很轻松. 用soapserver的try和cacth获取不了多少信息

  7. 浅谈Mamcached集成web项目

    1.资源文件配置 config.properties 添加 #memcached服务器地址 memchchedIP=192.168.1.8 2.编写工具类 MemUtils package cn.co ...

  8. .NET设计模式(4):建造者模式(Builder Pattern)

    ):建造者模式(Builder Pattern)    .建造者模式的使用使得产品的内部表象可以独立的变化.使用建造者模式可以使客户端不必知道产品内部组成的细节. 2.每一个Builder都相对独立, ...

  9. 读取Properties配置文件

    一,Android中 在Android中读取配置文件,可以使用System.getProperties()方法读取: 1,在res资源目录下,新建一个文件夹 raw,然后在其下创建一个.propert ...

  10. spring 的 PropertyPlaceholderConfigurer读取的属性怎么访问 (java访问方式,不是xml中的占位符哦)及此类的应用

    一.1.占位符的应用:(@Autowired注解方式,不需要建立set与get方法了,xml注入也不需要写了) http://www.cnblogs.com/susuyu/archive/2012/0 ...