BZOJ3237 AHOI2013连通图(线段树分治+并查集)
把查询看做是在一条时间轴上。那么每条边都有几段存在时间。于是线段树分治就好了。
然而在bzoj上t掉了,不知道是常数大了还是写挂了。
以及brk不知道是啥做数组名过不了编译。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
#define M 200010
int n,m,k,L[N<<],R[N<<],fa[N],size[N];
bool ans[N];
struct edge{int x,y;}e[M];
vector<edge> tree[N<<];
vector<int> bre[M];
stack<edge> undo[N<<];
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;
if (l==r) return;
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
void add(int k,int l,int r,edge e)
{
if (L[k]==l&&R[k]==r) {tree[k].push_back(e);return;}
int mid=L[k]+R[k]>>;
if (r<=mid) add(k<<,l,r,e);
else if (l>mid) add(k<<|,l,r,e);
else add(k<<,l,mid,e),add(k<<|,mid+,r,e);
}
int find(int x){return fa[x]==x?x:find(fa[x]);}
void merge(int k,int x,int y)
{
if (size[x]<size[y]) swap(x,y);
edge a;a.x=x,a.y=y;
undo[k].push(a);
fa[y]=x;size[x]+=size[y];
}
void solve(int k)
{
int s=tree[k].size();
for (int i=;i<s;i++)
{
int p=find(tree[k][i].x),q=find(tree[k][i].y);
if (p!=q) merge(k,p,q);
}
if (size[find()]==n) for (int i=L[k];i<=R[k];i++) ans[i]=;
else if (L[k]<R[k]) solve(k<<),solve(k<<|);
while (!undo[k].empty())
{
edge a=undo[k].top();
fa[a.y]=a.y;size[a.x]-=size[a.y];
undo[k].pop();
}
}
int main()
{
n=read(),m=read();
for (int i=;i<=m;i++) e[i].x=read(),e[i].y=read();
k=read();
for (int i=;i<=k;i++)
{
int s=read();
for (int j=;j<=s;j++)
{
int x=read();
bre[x].push_back(i);
}
}
build(,,k);
for (int i=;i<=m;i++)
{
int s=bre[i].size();
if (s==) add(,,k,e[i]);
else
{
if (bre[i][]->=) add(,,bre[i][]-,e[i]);
for (int j=;j<s;j++)
if (bre[i][j]->=bre[i][j-]+) add(,bre[i][j-]+,bre[i][j]-,e[i]);
if (bre[i][s-]+<=k) add(,bre[i][s-]+,k,e[i]);
}
}
for (int i=;i<=n;i++) fa[i]=i,size[i]=;
solve();
for (int i=;i<=k;i++)
if (ans[i]) printf("Connected\n");
else printf("Disconnected\n");
return ;
}
BZOJ3237 AHOI2013连通图(线段树分治+并查集)的更多相关文章
- BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)
Description 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 Connec ...
- 2018.10.01 bzoj3237: [Ahoi2013]连通图(cdq分治+并查集)
传送门 cdq分治好题. 对于一条边,如果加上它刚好连通的话,那么删掉它会有两个大集合A,B.于是我们先将B中禁用的边连上,把A中禁用的边禁用,再递归处理A:然后把A中禁用的边连上,把B中禁用的边禁用 ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- 3237: [Ahoi2013]连通图 线段树分治
题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- BZOJ4025 二分图(线段树分治+并查集)
之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- [BZOJ4025]二分图(线段树分治,并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2191 Solved: 800[Submit][Status][Discuss] ...
随机推荐
- 开发板测试-GPRS
注意事项: 经过测试,为了使STM32和Air202的串口稳定通信,需要更改 以前电路感觉应该是三极管控制极4.7K电阻太大,又因为开关速度快,然后开关的时候导致不足以让三极管处于全部导通状态,所以电 ...
- oracle 相除后保留指定位数小数round()
) xxx from dual; XXX---------- 3.8871
- oracle 记录被另一个用户锁住
第一步:查询处用户,被锁表名,sessionID select b.owner,b.object_name,l.session_id,l.locked_modefrom v$locked_object ...
- .NET的弹性及瞬间错误处理库Polly
原文:.NET的弹性及瞬间错误处理库Polly 本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET ...
- WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法
原文:WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法 WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法 最近在做 ...
- tomcat多实例方案启动脚本
批量启动 #!/bin/sh BASE_PATH="/usr/local/tomcat8/tomcat-ins/"bash $BASE_PATH/web1/tomcat.sh st ...
- windows 脚本
sudo.vbs http://blog.csdn.net/qidi_huang/article/details/52242053 c:\windows\sudo.vbs 'ShellExecute ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限.所以打算在这台2U服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求.当KVM ...
- python基础学习笔记(九)
python异常 python用异常对象(exception object)来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误 ...
- D. Boxes Packing
链接 [http://codeforces.com/contest/1066/problem/D] 题意 题目大意 n个物品m个篮子每个篮子容量为k 每个物品重量为a[i] 问能装多少物品 这个人是强 ...