BZOJ 3237: [Ahoi2013]连通图
3237: [Ahoi2013]连通图
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 1161 Solved: 399
[Submit][Status][Discuss]
Description
.jpg)
Input
.jpg)
Output
.jpg)
Sample Input
1 2
2 3
3 4
4 1
2 4
3
1 5
2 2 3
2 1 2
Sample Output
Connected
Disconnected
Connected
HINT
N<=100000 M<=200000 K<=100000
Source
很有意思的一道题。乍一看就是LCT,后来听说可以CDQ水过,一想确实哎,写写就1A了。
对于一张图的连通性,我们可以用并查集维护,简单方便,可是不支持删边操作(这里指的是随机的删边)。但发现可以通过记录father数组的更改,得到一个回溯栈,方便地进行顺序删边。
利用CDQ分治的想法,在一个solve(l,r)时,考虑把(mid,r]内的边补回到图中,维护并查集并记录改变(用来回溯),然后递归solve(l,mid),最后回溯;再把[l,mid]的边补回,递归右侧,回溯。这样到底层solve(l,r),即l==r时,并查集维护的刚好不包含当前这组询问中的边,此时记录下答案即可。
#include <bits/stdc++.h>
inline int getC(void) {
static const int siz = ;
static char buf[siz];
static char *hd = buf + siz;
static char *tl = buf + siz;
if (hd == tl)
fread(hd = buf, , siz, stdin);
return int(*hd++);
}
inline int getI(void) {
register int ret = ;
register int neg = false;
register int bit = getC();
for (; bit < ; bit = getC())
if (bit == '-')neg ^= true;
for (; bit > ; bit = getC())
ret = ret * + bit - '';
return neg ? -ret : ret;
}
const int maxn = ;
int n, m, p;
struct edge {
int x, y;
}e[maxn];
struct query {
int k, s[];
bool connect;
}q[maxn];
int fa[maxn];
int sz[maxn];
int cnt[maxn];
inline int find(int u) {
while (fa[u] != u)
u = fa[u];
return u;
}
int stk[maxn], tot;
void solve(int l, int r) {
if (l == r) {
q[l].connect = sz[find()] == n;
return;
}
int mid = (l + r) >> , top = tot;
for (int i = l; i <= mid; ++i)
for (int j = ; j <= q[i].k; ++j)
if (--cnt[q[i].s[j]] == ) {
int x = find(e[q[i].s[j]].x);
int y = find(e[q[i].s[j]].y);
if (x != y) {
if (sz[x] < sz[y])
fa[x] = y, sz[y] += sz[x], stk[++tot] = x;
else
fa[y] = x, sz[x] += sz[y], stk[++tot] = y;
}
}
solve(mid + , r);
while (tot > top) {
int t = stk[tot--];
sz[fa[t]] -= sz[t];
fa[t] = t;
}
for (int i = l; i <= mid; ++i)
for (int j = ; j <= q[i].k; ++j)
++cnt[q[i].s[j]];
for (int i = mid + ; i <= r; ++i)
for (int j = ; j <= q[i].k; ++j)
if (--cnt[q[i].s[j]] == ) {
int x = find(e[q[i].s[j]].x);
int y = find(e[q[i].s[j]].y);
if (x != y) {
if (sz[x] < sz[y])
fa[x] = y, sz[y] += sz[x], stk[++tot] = x;
else
fa[y] = x, sz[x] += sz[y], stk[++tot] = y;
}
}
solve(l, mid);
while (tot > top) {
int t = stk[tot--];
sz[fa[t]] -= sz[t];
fa[t] = t;
}
for (int i = mid + ; i <= r; ++i)
for (int j = ; j <= q[i].k; ++j)
++cnt[q[i].s[j]];
}
signed main(void) {
n = getI();
m = getI();
for (int i = ; i <= n; ++i)
fa[i] = i, sz[i] = ;
for (int i = ; i <= m; ++i)
e[i].x = getI(),
e[i].y = getI();
p = getI();
for (int i = ; i <= p; ++i) {
q[i].k = getI();
for (int j = ; j <= q[i].k; ++j)
++cnt[q[i].s[j] = getI()];
}
for (int i = ; i <= m; ++i)
if (!cnt[i]) {
int x = find(e[i].x);
int y = find(e[i].y);
if (x != y) {
if (sz[x] < sz[y])
fa[x] = y, sz[y] += sz[x];
else
fa[y] = x, sz[x] += sz[y];
}
}
solve(, p);
for (int i = ; i <= p; ++i)
puts(q[i].connect ? "Connected" : "Disconnected");
}
@Author: YouSiki
BZOJ 3237: [Ahoi2013]连通图的更多相关文章
- BZOJ 3237([Ahoi2013]连通图-cdq图重构-连通性缩点)
3237: [Ahoi2013]连通图 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 106 Solved: 31 [ Submit][ St ...
- 3237: [Ahoi2013]连通图 线段树分治
题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...
- [BZOJ3237][AHOI2013]连通图(分治并查集)
3237: [Ahoi2013]连通图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1736 Solved: 655[Submit][Status ...
- BZOJ 3233: [Ahoi2013]找硬币
BZOJ 3233: [Ahoi2013]找硬币 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 64 MB Description ...
- BZOJ 3235: [Ahoi2013]好方的蛇
BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...
- 线段树分治初步学习&洛谷P5227[AHOI2013]连通图
线段树分治 其实思想说起来是比较简单的,我们把这个题里的所有操作(比如连边删边查询balabala)全部拍到一棵线段树上,然后对着整棵树dfs一下求解答案,顺便把操作做一下,回溯的时候撤销一下即可.虽 ...
- bzoj 3237 连通图 - 并查集 - 线段树
Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconne ...
- 【bzoj3237】 Ahoi2013—连通图
http://www.lydsy.com/JudgeOnline/problem.php?id=3237 (题目链接) 题意 给出一个无向图,$Q$组询问,每次询问将原图断掉$C$条边后是否还连通. ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
随机推荐
- 【Android】开发中个人遇到和使用过的值得分享的资源合集
Android-Classical-OpenSource Android开发中 个人遇到和使用过的值得分享的资源合集 Trinea的OpenProject 强烈推荐的Android 开源项目分类汇总, ...
- 一个由Response.Redirect 引起的性能问题的分析
现象: 某系统通过单点登录(SSO) 技术验证用户登录.用户在SSO 系统上通过验证后,跳转到某系统的主页上面.而跳转的时间很长,约1分钟以上. 分析步骤: 在问题复现时抓取Hang dump 进行分 ...
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...
- 【无私分享:ASP.NET CORE 项目实战(第十三章)】Asp.net Core 使用MyCat分布式数据库,实现读写分离
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我 ...
- c++ map 使用
. 包含头文件: #include <map> 2. 构造函数: std::map<char,int> first; first[; first[; first[; first ...
- intellij idea 15 修改基础配置加载路径
一.概述 intellij idea 15 默认配置的启动加载路径是"C:\Users\Administrator.IntelliJIdea15",这样会导致占用C盘的空间越来越多 ...
- C#计算代码行数
class Program { static void Main(string[] args) { int totalLineCount = 0; string directory; if(args. ...
- 开发属于自己的yeoman脚手架(generator-reactpackage)
自从前后端开始分离之后,前端项目工程化也显得越来越重要了,之前写过一篇搭建基于Angular+Requirejs+Grunt的前端项目教程,有兴趣的可以点这里去看 但是有些项目可以使用这种方式,但有些 ...
- RMI(远程接口调用)
1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传输层(Transport ...
- armv7 armv7s arm64
arm处理器以其低功耗和小尺寸而闻名,几乎所有的手机处理器都是基于arm,在嵌入式系统中应用非常广泛. armv6, armv7, armv7s, arm64指的是arm处理器的指令集. i386 ...