BZOJ4025: 二分图(LCT)
Description
Input
Output
Sample Input
1 2 0 2
2 3 0 3
1 3 1 2
Sample Output
No
Yes
解题思路:
LCT维护图的连通性很好的一道题。
发现如果是树那么一定可以,如果奇数环一定不是。
离线一下,然后维护一颗树中最早被删除的点。
维护最后一条边(可以用数组存)
最后判一下就好了。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lll tr[spc].ch[0]
#define rrr tr[spc].ch[1]
#define ls ch[0]
#define rs ch[1]
using std::swap;
using std::sort;
const int E=;
struct trnt{
int ch[];
int fa;
int lzt;
int val;
int mnp;
int mn;
int sum;
int tip;
bool anc;
}tr[];
struct ent{
int f,t,dl;
}e[];
struct Event{
bool cmd;
int f,t,tpc;
int no;
}ev[];
int n,m,T;
int num;
int cnt;
bool onr[];
bool odd[];
bool whc(int spc)
{
return tr[tr[spc].fa].rs==spc;
}
void pushup(int spc)
{
tr[spc].sum=tr[spc].val;
tr[spc].mn=tr[spc].tip;
tr[spc].mnp=spc;
if(lll)
{
tr[spc].sum+=tr[lll].sum;
if(tr[spc].mn>tr[lll].mn)
{
tr[spc].mn=tr[lll].mn;
tr[spc].mnp=tr[lll].mnp;
}
}
if(rrr)
{
tr[spc].sum+=tr[rrr].sum;
if(tr[spc].mn>tr[rrr].mn)
{
tr[spc].mn=tr[rrr].mn;
tr[spc].mnp=tr[rrr].mnp;
}
}
return ;
}
void trr(int spc)
{
if(!spc)
return ;
tr[spc].lzt^=;
swap(lll,rrr);
return ;
}
void pushdown(int spc)
{
if(tr[spc].lzt)
{
tr[spc].lzt=;
trr(lll);
trr(rrr);
}
return ;
}
void recal(int spc)
{
if(!tr[spc].anc)
recal(tr[spc].fa);
pushdown(spc);
return ;
}
void rotate(int spc)
{
int f=tr[spc].fa;
bool k=whc(spc);
tr[f].ch[k]=tr[spc].ch[!k];
tr[spc].ch[!k]=f;
if(tr[f].anc)
{
tr[spc].anc=;
tr[f].anc=;
}else
tr[tr[f].fa].ch[whc(f)]=spc;
tr[spc].fa=tr[f].fa;
tr[f].fa=spc;
tr[tr[f].ch[k]].fa=f;
pushup(f);
pushup(spc);
return ;
}
void splay(int spc)
{
recal(spc);
while(!tr[spc].anc)
{
int f=tr[spc].fa;
if(tr[f].anc)
{
rotate(spc);
return ;
}
if(whc(spc)^whc(f))
rotate(spc);
else
rotate(f);
rotate(spc);
}
return ;
}
void access(int spc)
{
int lst=;
while(spc)
{
splay(spc);
tr[rrr].anc=;
tr[lst].anc=;
rrr=lst;
pushup(spc);
lst=spc;
spc=tr[spc].fa;
}
return ;
}
void Mtr(int spc)
{
access(spc);
splay(spc);
trr(spc);
return ;
}
void split(int x,int y)
{
Mtr(x);
access(y);
splay(y);
return ;
}
int finf(int spc)
{
access(spc);
splay(spc);
while(lll)
spc=lll;
return spc;
}
void link(int x,int y)
{
Mtr(x);
tr[x].fa=y;
return ;
}
void cut(int x,int y)
{
split(x,y);
tr[x].fa=tr[y].ls=;
tr[x].anc=;
pushup(y);
return ;
}
void Insert(int frm,int twd,int spc,int Time)
{
if(frm==twd)
{
num++;
odd[spc]=true;
return ;
}
Mtr(frm);
if(finf(twd)==frm)
{
int x=tr[twd].mnp-E;
if(e[x].dl<Time)
{
onr[x]=false;
onr[spc]=true;
if(tr[twd].sum%==)
{
odd[x]=true;
num++;
}
cut(e[x].f,x+E);
cut(e[x].t,x+E);
link(frm,spc+E);
link(twd,spc+E);
}else{
if(tr[twd].sum%==)
{
odd[spc]=true;
num++;
}
}
}else{
link(frm,spc+E);
link(twd,spc+E);
onr[spc]=true;
}
return ;
}
void Delete(int frm,int twd,int spc)
{
if(onr[spc])
{
cut(frm,spc+E);
cut(twd,spc+E);
onr[spc]=false;
return ;
}
if(odd[spc])
{
odd[spc]=false;
num--;
}
return ;
}
bool cmp(Event x,Event y)
{
return x.tpc<y.tpc;
}
int main()
{
scanf("%d%d%d",&n,&m,&T);
for(int i=;i<=n;i++)
{
tr[i].anc=;
tr[i].tip=0x3f3f3f3f;
}
for(int i=;i<=m;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
ev[++cnt]=(Event){,a,b,c,i};
ev[++cnt]=(Event){,a,b,d,i};
e[i]=(ent){a,b,d};
int spc=i+E;
tr[spc].anc=;
tr[spc].mn=d;
tr[spc].tip=d;
tr[spc].mnp=i;
tr[spc].val=;
}
sort(ev+,ev+cnt+,cmp);
for(int i=,hpn=;i<=T;i++)
{
for(;(hpn<=cnt)&&(ev[hpn].tpc<i);hpn++)
{
Event x=ev[hpn];
if(!x.cmd)
Insert(x.f,x.t,x.no,e[x.no].dl);
else
Delete(x.f,x.t,x.no);
}
if(num)
puts("No");
else
puts("Yes");
}
return ;
}
BZOJ4025: 二分图(LCT)的更多相关文章
- bzoj4025: 二分图 lct
题意:带增删边的查询二分图 题解:因为二分图肯定带奇环,lct维护,每次要加入一条边之前判断会不会构成环,如果会就把最先会删除的边删掉,然后如果是奇环就打个标记,然后把奇环数++,删除的时候,把标记删 ...
- [BZOJ4025] 二分图 LCT/(线段树分治+并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2667 Solved: 989[Submit][Status][Discuss] ...
- bzoj4025 二分图 LCT + 最小生成树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4025 题解 貌似这道题有一个非常简单的做法是线段树分治+并查集. 可是我是为了练 LCT 来做 ...
- 【BZOJ4025】二分图 LCT
[BZOJ4025]二分图 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于 ...
- [BZOJ4025]二分图(线段树分治,并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2191 Solved: 800[Submit][Status][Discuss] ...
- [bzoj4025]二分图_LCT
二分图 bzoj-4025 题目大意:给定一个n个节点的图,m条边,每条边有一个产生时间和一个删除时间,询问所有时间点是否是连通图. 注释:$1\le n\le 10^5$,$1\le m\le 2\ ...
- bzoj4025 二分图
支持加边和删边的二分图判定,分治并查集水之(表示我的LCT还很不熟--仅仅停留在极其简单的模板水平). 由于是带权并查集,并且不能路径压缩,所以对权值(到父亲距离的奇偶性)的维护要注意一下. 有一个小 ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并
原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...
随机推荐
- 利用photoshop的动作功能实现图片批处理操作
首先,通过"窗体菜单"点击"动作".启动动作栏. 然后.通过动作栏的菜单,新建动作. 接着,完毕一个标准操作,包含打开图像,图像处理或者格式转换,另存为,等. ...
- hdoj--1342--Lotto(dfs)
Lotto Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Docker -- 系统整洁之道 -- 0
在我的小 rmbp 256G的硬盘里,实在是装不下100多个G的虚拟机了,所以想把一些东西迁移到这两年很火的Docker下,Docker以前也有过一两次,只是按着别人给的用法用的,具体的一些细节并没有 ...
- Servlet doPost方法同时上传图片和传递参数
上传图片和传递参数 上传图片和文件属于enctype="multipart/form-data" form中加入enctype="multipart/form-data ...
- Java基础String的方法
Java基础String的方法 字符串类型写法格式如下: 格式一: String 变量名称; 变量名称=赋值(自定义或传入的变量值); 格式二: String 变量名称=赋值(自定义或传入的变量值); ...
- 【2017 Multi-University Training Contest - Team 1 1001】Add More Zero
[Link]: [Description] 让你求最大的k; 使得 10^k<=2^m-1 [Solution] 求出2^m-1的位数就好; [lg(2^m-1)] = lg(2^m) = m* ...
- Webhook
Webhook就是用户通过自定义回调函数的方式来改变Web应用的一种行为,这些回调函数可以由不是该Web应用官方的第三方用户或者开发人员来维护,修改.通过Webhook,你可以自定义一些行为通知到指定 ...
- hdu 1875 畅通project再续(kruskal算法计算最小生成树)
畅通project再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- vim 跨文件复制
我们都知道,当我们在一个文件之间进行复制粘贴的时候,vim提供给我们的方法非常多,三个模式下都有方法实现字符.句子.段落之间的复制粘贴.当时,如果我们想要在两个文件之间进行复制粘贴,这就有点麻烦了.我 ...
- Scott Hanselman的问题-1
Scott Hanselman的问题 .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题) 过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西. ...