BZOJ 3514 GERALD07加强版 (LCT+主席树)
题目大意:给定n个点m条边无向图,每次询问求当图中有编号为[L,R]的边时,整个图的联通块个数,强制在线
神题!(发现好久以前的题解没有写完诶)
我们要求图中联通块的个数,似乎不可搞啊。
联通块个数=n-树边条数!
考虑每条边的贡献,我们按编号从小到大暴力枚举每一条边。
考虑用$LCT$维护森林。
设新加入的这条边编号为$e$,连接了$x,y$两个点
如果$x,y$原来不连通,说明加入$e$会让图中多一条树边。边e对$L\in [1,e],R\geq e$的图$[L,R]$产生一点贡献
如果$x,y$原来就联通,说明加入$e$会产生环,并不会影响联通块个数。我们找出$e$所在环里编号最小的边$x$
当$L\leq x$时,删掉边$x$,图$[L,R]$的树边个数不变。
当$L>x$时,删掉边$x$,会让图$[L,R]$少一条树边。那么边$x$会对$L\in[x+1,e],R\geq e$的的图$[L,R]$产生一点贡献
如何处理询问?我们可以用主席树,主席树不同的根作为右端点,线段树维护对左端点的贡献。每次查询,主席树相减,然后单点查询
如何维护贡献?主席树上打差分实现区间修改
如何维护编号最小的边?把边转化成点扔到$LCT$里就行啦
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 401000
#define M1 201000
#define S1 (N1<<1)
#define T1 (N1<<2)
#define ll long long
#define uint unsigned int
#define rint register int
#define ull unsigned long long
#define dd double
#define il inline
#define inf 1000000000
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,T,type;
struct Edge{
int x[M1],y[M1],cte;
void ae(int u,int v)
{cte++;x[cte]=u,y[cte]=v;}
}E;
struct SEG{
int ls[N1*],rs[N1*],sum[N1*],root[N1],tot;
void pushup(int rt){sum[rt]=sum[ls[rt]]+sum[rs[rt]];}
void build(int l,int r,int &rt)
{
int mid=(l+r)>>; rt=++tot;
if(l==r) return;
build(l,mid,ls[rt]);
build(mid+,r,rs[rt]);
}
void update(int x,int l,int r,int r1,int &r2,int w)
{
if((!r2)||(r1==r2)){r2=++tot,sum[r2]=sum[r1],ls[r2]=ls[r1],rs[r2]=rs[r1];}
if(l==r) {sum[r2]+=w; return;} int mid=(l+r)>>;
if(x<=mid) update(x,l,mid,ls[r1],ls[r2],w);
else update(x,mid+,r,rs[r1],rs[r2],w);
pushup(r2);
}
int query(int L,int R,int l,int r,int rt)
{
if(!rt||L>R) return ;
if(L<=l&&r<=R) return sum[rt];
int mid=(l+r)>>,ans=;
if(L<=mid) ans+=query(L,R,l,mid,ls[rt]);
if(R>mid) ans+=query(L,R,mid+,r,rs[rt]);
return ans;
}
}s;
namespace lct{
int ch[N1][],fa[N1],mi[N1],id[N1],rev[N1],tot;
int idf(int x){return ch[fa[x]][]==x?:;}
int isroot(int x){return (ch[fa[x]][]==x||ch[fa[x]][]==x)?:;}
void pushup(int x){mi[x]=min(x,min(mi[ch[x][]],mi[ch[x][]]));}
void revers(int x){swap(ch[x][],ch[x][]),rev[x]^=;}
void pushdown(int x){if(rev[x]){revers(ch[x][]),revers(ch[x][]),rev[x]^=;}}
void rot(int x)
{
int y=fa[x],ff=fa[y],px=idf(x),py=idf(y);
if(!isroot(y)) ch[ff][py]=x; fa[x]=ff;
fa[ch[x][px^]]=y,ch[y][px]=ch[x][px^];
ch[x][px^]=y,fa[y]=x;
pushup(y),pushup(x);
}
int stk[N1],tp;
void splay(int x)
{
int y=x; stk[++tp]=x;
while(!isroot(y)){stk[++tp]=fa[y],y=fa[y];}
while(tp){pushdown(stk[tp--]);}
while(!isroot(x))
{
y=fa[x];
if(isroot(y)) rot(x);
else if(idf(y)==idf(x)) rot(y),rot(x);
else rot(x),rot(x);
}
}
void access(int x){for(int y=;x;y=x,x=fa[x]) splay(x),ch[x][]=y,pushup(x);}
void mkroot(int x){access(x),splay(x),revers(x);}
void split(int x,int y){mkroot(x),access(y),splay(y);}
int fdroot(int x){access(x),splay(x);while(ch[x][])pushdown(ch[x][]),x=ch[x][];return x;}
void cut(int x,int y){split(x,y);fa[x]=ch[y][]=,pushup(y);}
void link(int x,int y){split(x,y);fa[x]=y;}
//int isconn(int x,int y){split(x,y);if(!ch[x][1]&&fa[x]=y&&ch[y][0]==x) return 1;}
void solve(int x,int y,int e)
{
split(x+m,y+m);
if(x==y){
int r1=s.root[e-],r2=s.root[e]=++s.tot;
s.sum[r2]=s.sum[r1],s.ls[r2]=s.ls[r1],s.rs[r2]=s.rs[r1];
}else if(fdroot(y+m)!=x+m){
s.update(,,m,s.root[e-],s.root[e],);
if(e<m) s.update(e+,,m,s.root[e-],s.root[e],-);
}else{
int id=mi[y+m],xx=E.x[id],yy=E.y[id];
cut(id,xx+m); cut(id,yy+m);
s.update(id+,,m,s.root[e-],s.root[e],);
if(e<m) s.update(e+,,m,s.root[e-],s.root[e],-);
}
link(e,x+m),link(e,y+m);
}
};
int tot; int main()
{
int i,j,x,y,Q,sx,sy,ans=; tot=n+m;
scanf("%d%d%d%d",&n,&m,&Q,&type);
for(j=;j<=m;j++) x=gint(), y=gint(), E.ae(x,y);
s.build(,m,s.root[]);
for(lct::mi[]=inf,i=;i<=n+m;i++) lct::mi[i]=i;
for(j=;j<=m;j++)
{
x=E.x[j]; y=E.y[j];
lct::solve(x,y,j);
}
for(j=;j<=Q;j++)
{
x=gint(), y=gint();
if(type) x^=ans,y^=ans;
sx=s.query(,x,,m,s.root[x-]);
sy=s.query(,x,,m,s.root[y]);
ans=n-(sy-sx);
printf("%d\n",ans);
}
return ;
}
BZOJ 3514 GERALD07加强版 (LCT+主席树)的更多相关文章
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版( LCT + 主席树 )
从左到右加边, 假如+的边e形成环, 那么记下这个环上最早加入的边_e, 当且仅当询问区间的左端点> _e加入的时间, e对答案有贡献(脑补一下). 然后一开始是N个连通块, 假如有x条边有贡献 ...
- [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2177 Solved: 834 ...
- 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树
题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以 ...
- BZOJ3514:GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...
- GERALD07加强版:lct,主席树,边化点
Description:N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 传送门. lct这么神仙的东西一个题解都不写怎么行??? 神仙思路啊. 其实不是很难但是的确不容 ...
- bzoj 3514: GERALD07加强版 lct+可持久化线段树
题目大意: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解: 这道题考试的时候没想出来 于是便爆炸了 结果今天下午拿出昨天准备的题表准备做题的时候 题表里就有这题 ...
- BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT
BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. I ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
随机推荐
- sap scriptfom 多语言翻译
在某项目中,因为客户上线较早,非常多打印程序的form是由scriptform制做,又因为美国工厂要上线.免不了对scriptform进行多语言翻译.以下是对当中的一个交货单打印进行的多语言翻译,分享 ...
- 【iOS开发系列】NSObject方法介绍
NSObject是OC中的基类,全部类都继承于此,这里面也给我们提供了非常多与"类"和"方法"相关的方法,本文将解说几个非常有用的方法. 正文: Person. ...
- linux下apache+openssl配置记录
软件环境 Apache Httpd 2.2.29 (http://httpd.apache.org ) OpenSSL 1.0.1h (http://www.openssl.org/source ) ...
- multiple web application host under the same website on IIS (authentication mode)
第一种方式,修改forms的name how to set the forms authentication cookie path assume you have already solved th ...
- Java获取NTP网络时间
最近项目中涉及到一个时间验证的问题,需要根据当前时间来验证业务数据是否过期.所以直接写代码如下: new java.util.Date().getTime(); 结果测试的时候出现了 ...
- Git 和 Redis 的基本认识
一: Git 二: Redis
- Python 39 数据库的数据类型
一:整型 为什么需要 数据分类? 1.为了描述事物更加准确 2.描述起来更方便 3.节省内存空间 例:1 a 你 utf8 下 5个字节 1 a b c unicode 6个字节 mysq ...
- sklearn中的数据预处理和特征工程
小伙伴们大家好~o( ̄▽ ̄)ブ,沉寂了这么久我又出来啦,这次先不翻译优质的文章了,这次我们回到Python中的机器学习,看一下Sklearn中的数据预处理和特征工程,老规矩还是先强调一下我的开发环境是 ...
- SpringBoot + MyBatis(注解版),常用的SQL方法
一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...
- spring 九种设计模式
spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一 ...