【BZOJ 4025】 (CDQ?还是整体二分?+并查集及它的恢复操作)
4025: 二分图
Description
神犇有一个n个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。Input
输入数据的第一行是三个整数n,m,T。第2行到第m+1行,每行4个整数u,v,start,end。第i+1行的四个整数表示第i条边连接u,v两个点,这条边在start时刻出现,在第end时刻消失。Output
输出包含T行。在第i行中,如果第i时间段内这个图是二分图,那么输出“Yes”,否则输出“No”,不含引号。Sample Input
3 3 3
1 2 0 2
2 3 0 3
1 3 1 2Sample Output
Yes
No
YesHINT
样例说明:0时刻,出现两条边1-2和2-3。第1时间段内,这个图是二分图,输出Yes。1时刻,出现一条边1-3。第2时间段内,这个图不是二分图,输出No。2时刻,1-2和1-3两条边消失。第3时间段内,只有一条边2-3,这个图是二分图,输出Yes。数据范围:n<=100000,m<=200000,T<=100000,1<=u,v<=n,0<=start<=end<=T。Source
【分析】
%%%大颓果,你可以看她的按秩合并题解:http://blog.csdn.net/u010336344/article/details/55194864
我打的是最简单那种并查集,每次修改father和dis的时候把操作压入栈里面,回溯的时候恢复并查集。
【表示第一次恢复并查集,从来没想过这个。。不过并查集时间很快的话应该也不会很耗空间吧?
我觉得主方法更像整体二分,T给的是一个区间,像线段树一样当完全在[l,r]中的时候进行操作,其余操作分到左右两个区间里面做。
回溯的时候恢复并查集。
大概就是这样。
哦对了,二分图就是看看是否有奇环,有的话一定不是二分图。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
#define Maxn 100010 struct node {int x,y,s,t;};
vector<node > S; int fa[Maxn],dis[Maxn];
bool ans[Maxn]; struct nnode {int x,f,d;};
stack<nnode> sta; void mak_f(int x,int ff,int dd)
{
nnode tt;
tt.x=x;tt.f=fa[x];tt.d=dis[x];
sta.push(tt);
fa[x]=ff;
dis[x]=dd;
} int ffa(int x)
{
if(fa[x]!=x)
{
int ff=ffa(fa[x]);
mak_f(x,ff,(dis[fa[x]]+dis[x])%);//fa[x]=ffa(fa[x]);
}
return fa[x];
} void ffind(int l,int r,vector<node> M)
{
vector<node> ll,rr;
ll.clear();rr.clear();
int mid=(l+r)>>,now=sta.size();
bool ok=;
for(int i=;i<M.size();i++)
{
node t=M[i];
if(t.s==l&&t.t==r)
{
if(ffa(t.x)==ffa(t.y))
{
if(dis[t.x]==dis[t.y]) {ok=;break;}
}
else
{
if(ffa(t.x)!=t.x)
{
mak_f(ffa(t.x),t.x,dis[t.x]);
mak_f(t.x,t.x,);
}
mak_f(t.x,t.y,);
}
}
else if(t.t<=mid) ll.push_back(t);
else if(t.s>mid) rr.push_back(t);
else
{
node tt=t;tt.t=mid;
ll.push_back(tt);tt.s=mid+;tt.t=t.t;
rr.push_back(tt);
}
}
if(l!=r&&!ok)
{
ffind(l,mid,ll);ffind(mid+,r,rr);
}
while(sta.size()>now)
{
nnode nw=sta.top();
sta.pop();
fa[nw.x]=nw.f;dis[nw.x]=nw.d;
}
if(ok)
{
for(int i=l;i<=r;i++) ans[i]=;
}
} int main()
{
int n,m,T;
scanf("%d%d%d",&n,&m,&T);
S.clear();
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=n;i++) dis[i]=;
for(int i=;i<=m;i++)
{
node t;
scanf("%d%d%d%d",&t.x,&t.y,&t.s,&t.t);
t.s++;
if(t.s<=t.t) S.push_back(t);
}
for(int i=;i<=T;i++) ans[i]=;
ffind(,T,S);
for(int i=;i<=T;i++) if(ans[i]) printf("Yes\n");
else printf("No\n");
return ;
}
2017-02-16 22:07:48
【BZOJ 4025】 (CDQ?还是整体二分?+并查集及它的恢复操作)的更多相关文章
- [AGC002D] Stamp Rally 整体二分+并查集
Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...
- BZOJ 4025 二分图(时间树+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题目大意] 给出一张图,有些边只存在一段时间,问在一个每个时间段, 这张图是否 ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...
- 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】
题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...
- 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)
题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...
- POJ2349二分+并查集,类似最小树的贪心
题意: 给你n个点,你的任务是构建一颗通讯树,然后给你一个s表示可以选出来s个点两两通讯不花钱,就是费用是0,其他的费用就是两点的距离,有个要求就是其他的费用中最大的那个最小. 思路: ...
- Cdq分治整体二分学习记录
这点东西前前后后拖了好几个星期才学会……还是自己太菜啊. Cdq分治的思想是:把问题序列分割成左右两个,先单独处理左边,再处理左边对右边的影响,再单独处理右边.这样可以消去数据结构上的一个log,降低 ...
- CDQ分治&整体二分学习个人小结
目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...
随机推荐
- WP8.1 Windows Phone 8.1开发:何如定义Pivot头部样式、定义Pivot头部颜色
Windows Phone 8.1 ,如何自定义Pivot头部样式?用Pivot控件完成这样的效果. 网上找了好久,只找到了windows phone 8的解决方案. 终于一个大神给支了招,我觉得我有 ...
- 暑假集训——cf热身赛部分题有感加其题解
刚刚开始集训,集训队队长暂时还没有拉专题,而是拉了部分codeforces上过题人数在2000左右的题组成了一场热身赛(其实就是一场练习),花了一天时间终于把它刷完了,其中很多题让我学到了很多骚操作, ...
- LESS使用简介!
我真的真的极度痛苦. 原本用了那么久的LESS,一直都是用编译工具(考拉)进行编译的,今天试了试用less.js来搞,按官网的都一毛一样,然而!就是编译不出来! 我用来擦鼻涕的卫生纸都一下午用了大半卷 ...
- JS 本地属性与继承属性
判断是否拥有某种属性 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' i ...
- Spring Boot:定制自己的starter
在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boo ...
- Caffe学习笔记2
Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...
- centos7系统安装配置
下载centos7 iso镜像 电脑里面本来有ubuntu系统,直接在u盘做好启动盘安装即可,选择手动分区(忘了),将原本ubuntu系统分区压缩200G.系统不要选择最小化,选择gnome的图形界面 ...
- unbutu下Io language的解释器安装
今晚看Io,然后要安装解释器,然后就记录下来了... 首先去官网下载 http://iolanguage.com 在页面下方的binaries那里找到自己系统对应的版本,我的是x64deb的,本来是下 ...
- 2017多校第8场 HDU 6133 Army Formations 线段树合并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6133 题意:给你一棵n个节点的二叉树,每个节点有一个提交任务的时间,每个节点总的提交任务的罚时为:提交 ...
- C中级 数据序列化简单使用和讨论 (二)
引言 - 一种更好的方式 其实不管什么语言, 开发框架都会遇到序列化问题. 序列化可以理解为A 和 B 交互的一种协议. 很久以前利用 printf 和 scanf 的协议实现过一套序列化问题. C ...