题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025

线段树分治,用 LCT 维护链的长度即可。不过很慢。

正常(更快)的方法应该是线段树分治+并查集(按秩合并,链长可以暴力爬)或者 LCT 维护删除时间最大生成树。就不写了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ls Ls[cr]
#define rs Rs[cr]
#define lc c[x][0]
#define rc c[x][1]
#define pb push_back
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+,M=2e5+;
int n,m,fa[N],c[N][],rev[N],siz[N],stk[N],tp;
int tot,Ls[M],Rs[M],top;
struct Node{
int x,y;
Node(int x=,int y=):x(x),y(y) {}
}sta[N];
vector<Node> vt[M]; void build(int l,int r,int cr)
{
if(l==r)return; int mid=l+r>>;
ls=++tot; build(l,mid,ls);
rs=++tot; build(mid+,r,rs);
}
void ins(int l,int r,int cr,int L,int R,Node k)
{
if(l>=L&&r<=R){vt[cr].pb(k);return;}
int mid=l+r>>;
if(L<=mid)ins(l,mid,ls,L,R,k);
if(mid<R)ins(mid+,r,rs,L,R,k);
} bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void pshp(int x){siz[x]=siz[lc]+siz[rc]+;}
void Rev(int x){if(rev[x]){rev[x]=;rev[lc]^=;rev[rc]^=;swap(lc,rc);}}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isrt(y))c[z][y==c[z][]]=x;
fa[x]=z;
fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
pshp(y); pshp(x);
}
void splay(int x)
{
stk[tp=]=x;
for(int k=x;!isrt(k);k=fa[k])stk[++tp]=fa[k];
for(int i=tp;i;i--)Rev(stk[i]);
int y,z;
while(!isrt(x))
{
y=fa[x]; z=fa[y];
if(!isrt(y))
( (x==c[y][])^(y==c[z][]) )?rotate(x):rotate(y);
rotate(x);
}
}
void access(int x)
{
for(int t=;x;splay(x),rc=t,pshp(x),t=x,x=fa[x]);
}
void mkrt(int x)
{
access(x); splay(x); rev[x]^=;
}
void split(int x,int y)
{
mkrt(x); access(y); splay(y);
}
bool link(Node k)
{
int x=k.x, y=k.y; split(x,y);
int cr=y; while(c[cr][])cr=c[cr][];
if(cr==x) return (siz[y]&);
sta[++top]=k; fa[x]=y; return false;
}
void cut(Node k)
{
int x=k.x, y=k.y; split(x,y);
c[y][]=fa[x]=; pshp(y);
}
void solve(int l,int r,int cr)
{
int sz=vt[cr].size(); bool flag=;
for(int i=;i<sz;i++)
{
flag=link(vt[cr][i]); if(flag)break;
}
if(flag){for(int i=l;i<=r;i++)puts("No");return;}
if(l==r){puts("Yes");return;}
int mid=l+r>>,nw=top;
solve(l,mid,ls); for(int& i=top;i>nw;i--)cut(sta[i]);
solve(mid+,r,rs); for(int& i=top;i>nw;i--)cut(sta[i]);
}
int main()
{
n=rdn();int T=rdn();m=rdn();
tot=;build(,m,);
for(int i=;i<=n;i++)siz[i]=;
for(int i=,u,v,st,en;i<=T;i++)
{
u=rdn();v=rdn();st=rdn()+;en=rdn();
ins(,m,,st,en,Node(u,v));
}
solve(,m,); return ;
}

bzoj 4025 二分图——线段树分治+LCT的更多相关文章

  1. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

  2. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

  3. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  4. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  5. BZOJ2001 HNOI2010城市建设(线段树分治+LCT)

    一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST.理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗.正解写不动了. #include<iostream> ...

  6. 【洛谷P4319】 变化的道路 线段树分治+LCT

    最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...

  7. P3206 [HNOI2010]城市建设 [线段树分治+LCT维护动态MST]

    Problem 这题呢 就边权会在某一时刻变掉-众所周知LCT不支持删边的qwq- 所以考虑线段树分治- 直接码一发 如果 R+1 这个时间修改 那就当做 [L,R] 插入了一条边- 然后删的边和加的 ...

  8. [BZOJ4025]二分图(线段树分治,并查集)

    4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2191  Solved: 800[Submit][Status][Discuss] ...

  9. BZOJ4025 二分图 线段树分治、带权并查集

    传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...

随机推荐

  1. iOS UI-(多)视图控制器的生命周期、加载方法和模态视图方法以及屌丝方法

    #import "ViewController.h" #import "SecondViewController.h" @interface ViewContr ...

  2. Splunk Enterprise architecture——转发器本质上是日志收集client附加负载均衡,indexer是分布式索引,外加一个集中式管理协调的中心节点

    Splunk Enterprise architecture and processes This topic discusses the internal architecture and proc ...

  3. vue 表单校验(二)

    vue 表单校验(二) vue element-ui表单校验 由于现在使用element-ui进行form表单校验,因而使用其自带的校验规则进行校验,发现有些并不是那么好校验,或者说是校验起来很繁琐, ...

  4. LD_PRELOAD的偷梁换柱之能

    作者: net66 原创 本文网址:http://www.cnblogs.com/net66/p/5609026.html 发布日期:2015 年 06月 22日 一.LD_PRELOAD是什么 LD ...

  5. JavaScript学习总结(八)——JavaScript数组

    JavaScript中的Array对象就是数组,首先是一个动态数组,无需预先制定大小,而且是一个像Java中数组.ArrayList.Hashtable等的超强综合体. 一.数组的声明 常规方式声明: ...

  6. python 数据科学

    参考资料: https://www.yiibai.com/python_data_science/python_bubble_charts.html

  7. 软工作业No.9 第六周 事后诸葛亮分析报告

    甜美女孩项目2048结果 整理:邓画月.曾祎祺 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 弄一个给用户消磨时间的游戏,定义的很清楚.该游戏玩 ...

  8. sping整合redis,以及做mybatis的第三方缓存

    一.spring整合redis Redis作为一个时下非常流行的NOSQL语言,不学一下有点过意不去. 背景:学习Redis用到的框架是maven+spring+mybatis(框架如何搭建这边就不叙 ...

  9. jQuery 禁用select和取消禁用之disabled

    jQuery1.5及以前: 禁用select: $('#groupId').attr('disabled','disabled'); 取消禁用: $('#groupId').removeAttr('d ...

  10. firefox下reset()不好使的问题

    最近在测试项目时发现,在firefox下,form.reset()方法对于隐藏的<input>等不起效果,导致程序中出现了错误,以下面为例: js代码: document.agentFor ...