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$个时间段.其中 ...
随机推荐
- js 阻断网页选中和右键
$(document).bind("contextmenu", function () { return false; }); $(document).bind("sel ...
- 《机器学习系统设计》之应用scikit-learn做文本分类(上)
前言: 本系列是在作者学习<机器学习系统设计>([美] WilliRichert)过程中的思考与实践,全书通过Python从数据处理.到特征project,再到模型选择,把机器学习解决这个 ...
- linux(debian/ubuntu)下连接安卓手机--小米4为例
更改:如今小米连接Ubuntu等Linux系统,直接改动手机上的连接方式就可以. --------------------------------------------- 因为安卓手机底层就是lin ...
- 冒泡排序算法 C#版
冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所 ...
- BZOJ 4144 Dijkstra+Kruskal+倍增LCA
思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...
- MySQL自定义函数(四十六)
MySQL自定义函数 一.什么是MYSQL自定义函数? mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同. 二.自定义函数应该具备哪些条件? 我 ...
- Linux系统安全加固(一)
Linux系统安全加固(一) 去年8月,某所网站遭黑客攻击瘫痪虽然港交所随后及时启用备用系统,但还是致使7支股票1支债卷被迫停牌,次日再次遭受攻击而瘫痪:在去年年底继CSDN信息安全出现之后, ...
- VMware下最小化安装centos 7 后上网设置
1.文件/etc/sysconfig/network-scripts/ifcfg-eno16777736 将ONBOOT=no 改为 ONBOOT=yes 保存 2.重启网卡:service netw ...
- Network Stack : HTTP Cache
HTTP Cache 目录 1 Operation 2 Sparse Entries 3 Truncated Entries 4 Byte-Range Requests 5 HttpCache::Tr ...
- 分享《Python 游戏编程快速上手(第3版)》高清中文版PDF+高清英文版PDF+源代码
通过编写一个个小巧.有趣的游戏来学习Python,通过实例来解释编程的原理的方式.14个游戏程序和示例,介绍了Python基础知识.数据类型.函数.流程控制.程序调试.流程图设计.字符串操作.列表和字 ...