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$个时间段.其中 ...
随机推荐
- 离散化求RECT1
本文转载至点击打开链接 #include<stdio.h> struct node{ int x1,y1,x2,y2,c; }; struct node s[1010]; int px[2 ...
- hdu 1102 Constructing Roads(kruskal || prim)
求最小生成树.有一点点的变化,就是有的边已经给出来了.所以,最小生成树里面必须有这些边,kruskal和prim算法都能够,prim更简单一些.有一点须要注意,用克鲁斯卡尔算法的时候须要将已经存在的边 ...
- Delegates, Events, and Anonymous Methods 委托、事件与匿名方法
http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html
- ssh 免密及加密远程脚本实现
windows_host文件路径:C:\Windows\System32\drivers\etc ssh-copy-id -i ~/.ssh/id-rsa.pub root@xxxxxxx 免密验证操 ...
- Android自定义控件简单实现ratingbar效果
先上图: 一开始让我自定义控件我是拒绝的,因为android很早以前就有一个控件ratingbar,但是设置样式的时候我发现把图片设置小一点就显示不全,一直找不到解办法!(可以设置系统的自带的小样式) ...
- DENON AVR-X510BT 功放设置记录
http://manuals.denon.com/avrx510bt/ap/zh/index.php 环绕模式 : Direct:直接 Sttereo:立体声 Dolby PL 声音模式 电影 : ...
- Mysql source导入.sql文件深坑!
刚刚接手一个项目,给老系统加功能.把数据库考出来一个.sql文件就170多M. 使用mysql命令行source 我的.sql文件. 导了一宿都没导完,然后发现里面的数据怎么是乱码呢.. 崩溃额,在排 ...
- uniq---报告或忽略文件中的重复行
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用. 语法 uniq(选项)(参数) 选项 -c或——count:在每列旁边显示该行重复出现的次数: -d或--repeated:仅显 ...
- Android中Service的一个Demo例子
Android中Service的一个Demo例子 Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding. 本文,主要贴代码,不对Servic ...
- Add Webhooks to Your API the Right Way
Add Webhooks to Your API the Right Way Adam DuVander / December 15, 2016 In the last 10 years, APIs ...