题目: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. Spring boot 嵌入的tomcat不能启动: Unregistering JMX-exposed beans on shutdown

    原因是:没有引入tomcat依赖包 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  2. 在Windows下配置svn服务端钩子程序(部分)

    需求一,svn提交时必须填写log日志的需求,如何进行配置呢?请看下面. 需要在版本库目录下找到hooks文件夹,我的版本库是dxoffice,所以是这个目录,你要找自己的目录 然后进入,创建一个pr ...

  3. git本地及远程分支回退

    1. git本地版本回退 Git reset --hard commit_id(可用 git log –oneline 查看) 2. git远程版本回退 git push origin HEAD -- ...

  4. UVALIve 5987 素数

    题目链接:Distinct Primes 如果一个数.至少有三个因子是素数..那么这个数就是prime num.30和42是前两个prime num.问你第n个这种数是谁.(1<=n<=1 ...

  5. linux command wc

    Linux command wc [Purpose]        Learning how to statistics line numbers in file   [Eevironment]    ...

  6. openssl 非对称加密DSA,RSA区别与使用介绍(转)

    openssl 非对称加密DSA,RSA区别与使用介绍(转) 博客分类: OS.Linux Security   在日常系统管理工作中,需要作一些加解密的工作,通过openssl工具包就能完成我们很多 ...

  7. GSM中时隙、信道、突发序列、帧的解释

    刚从论坛中看到有人问GSM中时隙.信道.突发序列.帧知识.今天我们数字通信正好上到这一块,我就根据我知道的和网上搜索的回答! 1.时分多路复用技术 FDMA:频分多址 TDMA:时分多址 CDMA:码 ...

  8. Iview同步异步验证

    直接上代码了: html: <Form ref="termForm" :model="currentData" :rules="ruleTerm ...

  9. Hadoop streaming使用自定义python版本和第三方库

    在使用Hadoop的过程中,遇到了自带python版本比较老的问题. 下面以python3.7为例,演示如何在hadoop上使用自定义的python版本以及第三方库. 1.在https://www.p ...

  10. Java中统计字符串中各个字符出现的次数

    import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo ...