bzoj 4025: 二分图
Description
神犇有一个n个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。
解题报告:
用时:2h30min,4WA
这题比较吼,首先想到要找奇环,然后我就不加思考的直接找奇环,然后取环上时间的公共部分,差分一波,发现时间不允许,然后线段树乱优化,发现并不能够维护,然后这么挂了,最后听说是cdq,按时间作为区间分治,然后加上完全在区间内的所有边,判断奇环,这里用到并查集的按秩合并,不能路径压缩,每一次把秩小的合并到大的,手玩发现复杂度是可以的,每一次暴力改回即可
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=100005;
int fa[N],d[N],n,m,T,ans[N],dis[N];
struct node{int x,y,l,r;};
vector<node>S;
int find(int x){while(x!=fa[x])x=fa[x];return x;}
int getdis(int x){
int ret=0;
while(x!=fa[x])ret^=dis[x],x=fa[x];
return ret;
}
int st[N<<2],top=0;
void merge(int x,int y,int to){
if(d[x]>d[y])swap(x,y);
if(d[x]==d[y])d[y]++,st[++top]=-y;
st[++top]=x;fa[x]=y;dis[x]=to;
}
void Clear(int last){
while(top!=last){
if(st[top]<0)d[-st[top]]--;
else fa[st[top]]=st[top],dis[st[top]]=0;
top--;
}
}
void solve(int l,int r,vector<node>S){
node a;int to,x,y,fx,fy,mid=(l+r)>>1,sz=S.size(),last=top;
vector<node>ll,rr;
for(int i=0;i<sz;i++){
a=S[i];
if(a.l==l && a.r==r){
x=a.x;y=a.y;
fx=find(x);fy=find(y);
to=getdis(x)^getdis(y)^1;
if(fx!=fy)merge(fx,fy,to);
else{
if(to==1){
for(int j=l;j<=r;j++)ans[j]=1;
Clear(last);return ;
}
}
}
else if(a.r<=mid)ll.push_back(a);
else if(a.l>mid)rr.push_back(a);
else{
ll.push_back((node){a.x,a.y,a.l,mid});
rr.push_back((node){a.x,a.y,mid+1,a.r});
}
}
if(l!=r)solve(l,mid,ll),solve(mid+1,r,rr);
Clear(last);
}
void work()
{
int x,y,s,t;
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=n;i++)fa[i]=i,d[i]=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&x,&y,&s,&t);
if(s<t)S.push_back((node){x,y,s+1,t});
}
solve(1,T,S);
for(int i=1;i<=T;i++)ans[i]?puts("No"):puts("Yes");
}
int main()
{
work();
return 0;
}
错的乱搞:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define ls (node<<1)
#define rs (node<<1|1)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=100005,M=200005;
int head[N],num=0,nxt[M<<1],to[M<<1],s[M<<1],t[M<<1],n,m,T,dfn[N],vis[N];
void link(int x,int y,int St,int Tt){
nxt[++num]=head[x];to[num]=y;head[x]=num;
s[num]=St;t[num]=Tt;
}
struct seg{int min,max;}tr[N<<2];int ans[N];bool app[N];
void upd(int node){
tr[node].min=Min(tr[ls].min,tr[rs].min);
tr[node].max=Max(tr[ls].max,tr[rs].max);
}
void updata(int l,int r,int node,int sa,int id){
if(l>sa || r<sa)return ;
if(l==r){tr[node].min=t[id];tr[node].max=s[id];return ;}
int mid=(l+r)>>1;
updata(l,mid,ls,sa,id);updata(mid+1,r,rs,sa,id);
upd(node);
}
seg query(int l,int r,int node,int sa,int se){
if(sa<=l && r<=se)return tr[node];
int mid=(l+r)>>1;
if(se<=mid)return query(l,mid,ls,sa,se);
else if(sa>mid)return query(mid+1,r,rs,sa,se);
else{
seg q1,q2,ret;
q1=query(l,mid,ls,sa,se);q2=query(mid+1,r,rs,sa,se);
ret.min=Min(q1.min,q2.min);ret.max=Max(q1.max,q2.max);
return ret;
}
}
void solve(int x,int y,int i){
seg tmp=query(1,n,1,dfn[x],dfn[y]-1);
tmp.min=Min(tmp.min,t[i]);
tmp.max=Max(tmp.max,s[i]);
if(tmp.min>=tmp.max)
ans[tmp.max+1]--,ans[tmp.min]++;
}
void dfs(int x,int last,int dep){
int u;dfn[x]=dep;
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(u==last || app[i])continue;
if(vis[u]==vis[x]){
solve(u,x,i);
app[i]=app[i^1]=true;
continue;
}
updata(1,n,1,dep,i);
if(!vis[u])vis[u]=3-vis[x],dfs(u,x,dep+1);
}
}
void work()
{
int x,y,St,Tt;
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&x,&y,&St,&Tt);
link(x,y,St,Tt-1);link(y,x,St,Tt-1);
}
vis[1]=1;dfs(1,1,1);
for(int i=1;i<=T;i++)ans[i]+=ans[i-1];
for(int i=0;i<T;i++)
if(ans[i])puts("No");
else puts("Yes");
}
int main()
{
work();
return 0;
}
bzoj 4025: 二分图的更多相关文章
- bzoj 4025 二分图 分治+并查集/LCT
bzoj 4025 二分图 [题目大意] 有n个点m条边,边会在start时刻出现在end时刻消失,求对于每一段时间,该图是不是一个二分图. 判断二分图的一个简单的方法:是否存在奇环 若存在奇环,就不 ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
- BZOJ 4025 二分图(时间树+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题目大意] 给出一张图,有些边只存在一段时间,问在一个每个时间段, 这张图是否 ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- 「bzoj 4025: 二分图」
题目 显然二分图没有奇环 于是考虑使用并查集维护一下看看是否存在奇环 我们可以考虑加权并查集,维护出\(x\)到\(fa_x\)的实际距离 由于我们只需要考虑奇偶性,于是我们处理出到根的路径异或一下就 ...
- 【刷题】BZOJ 4025 二分图
Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...
- bzoj 4025 二分图 lct
题目传送门 题解: 首先关于二分图的性质, 就是没有奇环边. 题目其实就是让你判断每个时段之内有没有奇环. 其次 lct 只能维护树,(反正对于我这种菜鸟选手只会维护树), 那么对于一棵树来说, 填上 ...
- BZOJ 4025 二分图 LCT维护最大生成树
怎么说呢,我也不知道该咋讲,你就手画一下然后 yy 一下就发现这么做是对的. 为什么我明明都想出来了,却还是讲不出来啊~ #include <cstdio> #include <ve ...
随机推荐
- (原创)不带模板的OLE输出EXCEL
目前我已知的EXCEL输出方式有3种: 1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出). 2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一 ...
- bzoj千题计划220:bzoj3938: Robot
http://www.lydsy.com/JudgeOnline/problem.php?id=3938 以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线 把折线分段加入线段树里,然后 ...
- nyoj 数的长度
描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)? 输入 首行输入n,表示有多少组测试数据(n<1 ...
- JAVA_SE基础——27.匿名对象
黑马程序员入学blog... 匿名对象:没有引用类型变量指向的对象称作为匿名对象. 匿名对象要注意的事项:1. 我们一般不会给匿名对象赋予属性值,因为永远无法获取到.2. 两个匿名对象永远都不可能是同 ...
- UML开发工具Rose ralation的破解安装,
UML开发工具Rose ralation的在windows764破解安装, 安装下载还可以参考:http://www.cnblogs.com/leaven/p/3718361.html 跟大家分享怎么 ...
- Python爬虫之urllib模块1
Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...
- 【漏洞复现】PHPCMS wap模块 SQL注入(附EXP)
漏洞影响版本:v9.5.8.v9.6.0 Step1: 访问:http://www.xxx.com/index.php?m=wap&a=index&siteid=1, 获取返回的coo ...
- R语言学习 第九篇:plyr包
在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...
- Python之进程
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...
- Ajax.html:35 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org
AJAX的容易错误的地方 Ajax.html:35 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated ...