题目: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相关推荐

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

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

  2. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  3. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  4. P5787 二分图 /【模板】线段树分治

    传送门 文章目录 题意: 思路: 题意: 思路: 线段树分治就是在线段树上进行遍历,到每个点都加上它对子节点的贡献,最后到叶子节点的时候算一下贡献. 对于这个题先考虑维护二分图的话,可以用扩展域并查集 ...

  5. P5787 二分图 /【模板】线段树分治(线段树分治、并查集)

    关于什么是合理的实现 解析 本题把并查集写在了题面上 然而,我却一直沉浸在一个及其通用的判断二分图的方法中: 一个图是二分图的充要条件是它没有奇环 怎么维护这个玩意?带权并查集! 怎么套线段树分治?可 ...

  6. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  7. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  8. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  9. 【CF813F】Bipartite Checking(线段树分治+可删除并查集)

    文章目录 title solution code title You are given an undirected graph consisting of n vertices. Initially ...

最新文章

  1. vue ts 设置tslint提示_Typescript 在 Vue 中的实践(包含2.x、3.x)
  2. Linux工业嵌入式应用
  3. 主窗体界面设计及功能实现
  4. Eclipse文档注释快捷键以及自定义文档注释内容
  5. 操作系统及编程语言历史以及shell命令
  6. router3 BGP1 基础部分
  7. 一步步编写操作系统81 att内嵌汇编语法
  8. 六、Numpy的使用(详解)
  9. 2.7-源码编译安装
  10. 360笔试题-字符置换
  11. MATLAB 生成随机数
  12. ExtJS视频教程1(上)
  13. LiveReload for mac 软件下载
  14. minitab学习系列(2)--CPK、PPK案例解析
  15. 自己做的一个漫画下载器
  16. BZOJ3503.【CQOI2014】和谐矩阵
  17. Set集合:求交集、并集和差集
  18. 求三角形面积-gyy
  19. 史上最详细的HashMap红黑树解析
  20. 如何利用手机访问电脑本地的localhost?

热门文章

  1. python操作mysql数据库实现增删改查
  2. 下载最新Android代码的方法
  3. 在CentOS 7中安装与配置Tomcat-8方法
  4. 我的理解:box-sizing
  5. 对Android 开发者有益的 40 条优化建议(转)
  6. FWFT FIFO读操作注意
  7. Apache反向代理设置【转载】
  8. 安装ATi显卡驱动后增加的鼠标右键菜单的清理
  9. 水晶报表调用存储过程的问题
  10. Java的List和Json转换以及StringRedisTemplate往redis存泛型对象