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=;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的更多相关文章
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- BZOJ2001 HNOI2010城市建设(线段树分治+LCT)
一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST.理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗.正解写不动了. #include<iostream> ...
- 【洛谷P4319】 变化的道路 线段树分治+LCT
最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...
- P3206 [HNOI2010]城市建设 [线段树分治+LCT维护动态MST]
Problem 这题呢 就边权会在某一时刻变掉-众所周知LCT不支持删边的qwq- 所以考虑线段树分治- 直接码一发 如果 R+1 这个时间修改 那就当做 [L,R] 插入了一条边- 然后删的边和加的 ...
- [BZOJ4025]二分图(线段树分治,并查集)
4025: 二分图 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2191 Solved: 800[Submit][Status][Discuss] ...
- BZOJ4025 二分图 线段树分治、带权并查集
传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...
随机推荐
- EBS Workflow参考资料
参考资料: How to send an email from oracle workflow process using an AdHocRole? Notification System APIs ...
- elasticsearch term match multi_match区别
转自:http://www.cnblogs.com/yjf512/p/4897294.html match 最简单的一个match例子: 查询和"我的宝马多少马力"这个查询语句匹配 ...
- jQuery 插件运行机制和 $冲突解决
1.jQuery.fn.extend(object) 基本插件假设我们要创建一个插件,使一组元素中的文本变为绿色.我们要做的就是添加一个名为greenify的函数, $.fn 将像其他任何jquery ...
- learning docker steps(3) ----- docker services 初次体验
参考:https://docs.docker.com/get-started/part3/#docker-composeyml docker 的 service样例, 我们可以理解成是一个本地负载均衡 ...
- Get gcc built-in macros using command gcc -dM -E - < /dev/null
root@vmuser-virtual-machine:/home/vmuser# gcc -dM -E - < /dev/null #define __SSP_STRONG__ 3#defin ...
- python爬虫常见面试题(二)
前言 之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆:二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正:三是我也是互联网寒潮下岗的那批人之一,为 ...
- 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(五)
MyEclipse限时秒杀!活动火热开启中>> [MyEclipse最新版下载] 六.部署到JBoss服务器 1. 右键单击Servers视图,然后选择New>Server,选择您安 ...
- Spring学习(一)--概述
Spring是什么? 是一个框架,是为了解决企业应用开发的复杂性而创建的框架 是一个框架,是一个轻量级的控制反转和面向切面的容器框架 从大小与开销两方面而言Spring都是轻量的 通过控制反转(IoC ...
- HDU 4970
http://acm.hdu.edu.cn/showproblem.php?pid=4970 比赛的时候线段树水过的,比赛后线段树一直T,看了下正解真的是智商压制 题意:走直线,长度1-N,还有一些人 ...
- ODBC 安装/使用/编程
前言: 主要讲解ODBC API, 以mysql为例, 从配置到安装, 再到具体的编程, 以期对ODBC有个初步的认识. *) 下载mysql, 选择社区版mysql, 并安装 http://dev. ...