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$个时间段.其中 ...
随机推荐
- Lesson 1 Basic Concepts: Part 1
www.how-to-build-websites.com/basic-concepts/part1.php An introduction to domain names, web servers, ...
- 101.C++继承三种权限
三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 三种继承特点 1.public继承不改变基类成员的访问权限 ...
- android开源项目---View篇
本文转载自:http://blog.csdn.net/likebamboo/article/details/19080739 主要介绍那些不错个性化的View,包括ListView.ActionBar ...
- 如何在Ubuntu14.04中安装mysql
接触过MySQL的小伙伴们都知道,在Windows下安装MySQL是一件让人十分头大的事情,但是在Ubuntu等其他Linux系统中安装MySQL就简单很多了,具体的教程如下.1.在Ubuntu的命令 ...
- 学习TF:《TensorFlow实战》中文版PDF+源代码
深度学习乃至人工智能正逐渐在FinTech领域发挥巨大的作用,其应用包括自动报告生成.金融智能搜索.量化交易和智能投顾.而TensorFlow为金融业方便地使用深度学习提供了可能.<Tensor ...
- 51nod 最长公共子序列+输出路径
当x = 0 或 y = 0时 f[x][y] = 0 当a[x] = b[y]时 f[x][y] = f[x-1][y-1]+1 当a[x] != b[y]时 f[x][y] = max(f[x] ...
- 在hive执行创建表的命令,遇到异常com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
今天在练习hive的操作时,在创建数据表时,遇到了异常 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ex ...
- C# textBox控件只允许为数字和小数点并且提取出这个数字
一. textBox控件实现只允许为数字和小数点 如下图所示,在textBox控件框内输入只能是 要在textBox控件属性设置按键按下的事件触发,如下图所示: 二.源代码 textBox控件只允许为 ...
- Android ScrollView滚动实现大众点评、网易云音乐评论悬停效果
今天听着网易云音乐,写着代码,真是爽翻了. http://blog.csdn.net/linshijun33/article/details/47910833 网易云音乐这个产品亮点应该在评论这一模块 ...
- SQl 行转列,列转行 (PIVOT,UPIVOT)
1.列转行 表t_pivot 转后效果 方法 1 (常用方法 case when) SELECT buydate, SUM(CASE WHEN type = '生活' THEN typec ...