bzoj 4025 二分图——线段树分治+LCT
题目: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=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } const int N=1e5+5,M=2e5+5; int n,m,fa[N],c[N][2],rev[N],siz[N],stk[N],tp; int tot,Ls[M],Rs[M],top; struct Node{int x,y;Node(int x=0,int y=0):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>>1;ls=++tot; build(l,mid,ls);rs=++tot; build(mid+1,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>>1;if(L<=mid)ins(l,mid,ls,L,R,k);if(mid<R)ins(mid+1,r,rs,L,R,k); }bool isrt(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;} void pshp(int x){siz[x]=siz[lc]+siz[rc]+1;} void Rev(int x){if(rev[x]){rev[x]=0;rev[lc]^=1;rev[rc]^=1;swap(lc,rc);}} void rotate(int x) {int y=fa[x],z=fa[y],d=(x==c[y][1]);if(!isrt(y))c[z][y==c[z][1]]=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=1]=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][0])^(y==c[z][0]) )?rotate(x):rotate(y);rotate(x);} } void access(int x) {for(int t=0;x;splay(x),rc=t,pshp(x),t=x,x=fa[x]); } void mkrt(int x) {access(x); splay(x); rev[x]^=1; } 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][0])cr=c[cr][0];if(cr==x) return (siz[y]&1);sta[++top]=k; fa[x]=y; return false; } void cut(Node k) {int x=k.x, y=k.y; split(x,y);c[y][0]=fa[x]=0; pshp(y); } void solve(int l,int r,int cr) {int sz=vt[cr].size(); bool flag=0;for(int i=0;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>>1,nw=top;solve(l,mid,ls); for(int& i=top;i>nw;i--)cut(sta[i]);solve(mid+1,r,rs); for(int& i=top;i>nw;i--)cut(sta[i]); } int main() {n=rdn();int T=rdn();m=rdn();tot=1;build(1,m,1);for(int i=1;i<=n;i++)siz[i]=1;for(int i=1,u,v,st,en;i<=T;i++){u=rdn();v=rdn();st=rdn()+1;en=rdn();ins(1,m,1,st,en,Node(u,v));}solve(1,m,1); return 0; }
转载于:https://www.cnblogs.com/Narh/p/10372849.html
bzoj 4025 二分图——线段树分治+LCT相关推荐
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- P5787 二分图 /【模板】线段树分治
传送门 文章目录 题意: 思路: 题意: 思路: 线段树分治就是在线段树上进行遍历,到每个点都加上它对子节点的贡献,最后到叶子节点的时候算一下贡献. 对于这个题先考虑维护二分图的话,可以用扩展域并查集 ...
- P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
关于什么是合理的实现 解析 本题把并查集写在了题面上 然而,我却一直沉浸在一个及其通用的判断二分图的方法中: 一个图是二分图的充要条件是它没有奇环 怎么维护这个玩意?带权并查集! 怎么套线段树分治?可 ...
- 【BZOJ4025】二分图(可撤销并查集+线段树分治)
题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- 【CF813F】Bipartite Checking(线段树分治+可删除并查集)
文章目录 title solution code title You are given an undirected graph consisting of n vertices. Initially ...
最新文章
- vue ts 设置tslint提示_Typescript 在 Vue 中的实践(包含2.x、3.x)
- Linux工业嵌入式应用
- 主窗体界面设计及功能实现
- Eclipse文档注释快捷键以及自定义文档注释内容
- 操作系统及编程语言历史以及shell命令
- router3 BGP1 基础部分
- 一步步编写操作系统81 att内嵌汇编语法
- 六、Numpy的使用(详解)
- 2.7-源码编译安装
- 360笔试题-字符置换
- MATLAB 生成随机数
- ExtJS视频教程1(上)
- LiveReload for mac 软件下载
- minitab学习系列(2)--CPK、PPK案例解析
- 自己做的一个漫画下载器
- BZOJ3503.【CQOI2014】和谐矩阵
- Set集合:求交集、并集和差集
- 求三角形面积-gyy
- 史上最详细的HashMap红黑树解析
- 如何利用手机访问电脑本地的localhost?