bzoj3514(LCT+主席树)
题目描述
N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数。
题解
对于一个截止时间来说,越晚的变越好。
所以我们可以维护一颗以边的序号为关键字的最大生成树,然后用主席树维护一下。
询问直接在R的主席树里查就可以了。
代码
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define N 400002
- using namespace std;
- int f[N],a[N],n,m,type,k;
- inline int rd(){
- int x=;char c=getchar();bool f=;
- while(!isdigit(c)){if(c=='-')f=;c=getchar();}
- while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
- return f?-x:x;
- }
- inline int find(int x){return f[x]=f[x]==x?x:find(f[x]);}
- struct LCT{
- int ch[N][],fa[N],l[N],tr[N];bool rev[N];
- #define ls ch[x][0]
- #define rs ch[x][1]
- inline bool ge(int x){return ch[fa[x]][]==x;}
- inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
- inline void pushup(int x){
- tr[x]=x;
- if(ls&&a[tr[ls]]<a[tr[x]])tr[x]=tr[ls];if(rs&&a[tr[rs]]<a[tr[x]])tr[x]=tr[rs];
- }
- inline void rotate(int x){
- int y=fa[x],o=ge(x);
- ch[y][o]=ch[x][o^];fa[ch[y][o]]=y;
- if(!isroot(y))ch[fa[y]][ge(y)]=x;fa[x]=fa[y];
- fa[y]=x;ch[x][o^]=y;pushup(y);pushup(x);
- }
- inline void pushdown(int x){if(rev[x]){rev[x]^=;rev[ls]^=;rev[rs]^=;swap(ls,rs);}}
- inline void _pushdown(int x){if(!isroot(x))_pushdown(fa[x]);pushdown(x);}
- inline void splay(int x){
- _pushdown(x);
- while(!isroot(x)){
- int y=fa[x];
- if(isroot(y))rotate(x);
- else rotate(ge(x)==ge(y)?y:x),rotate(x);
- }
- }
- inline int findroot(int x){
- access(x);splay(x);pushdown(x);
- while(ls)x=ls,pushdown(x);return x;
- }
- inline void access(int x){for(int y=;x;y=x,x=fa[x])splay(x),ch[x][]=y,pushup(x);}
- inline void makeroot(int x){access(x);splay(x);rev[x]^=;}
- inline void split(int x,int y){makeroot(x);access(y);splay(y);}
- inline void link(int x,int y){makeroot(x);fa[x]=y;}
- inline void cut(int x,int y){split(x,y);fa[x]=ch[y][]=;pushup(y);}
- void dfs(int x){
- if(ls)dfs(ls);cout<<x<<" ";if(rs)dfs(rs);
- }
- #undef ls
- #undef rs
- }lct;
- int tot,ls[N*],rs[N*],sum[N*],T[N],ans;
- void upd(int &cnt,int pre,int l,int r,int x,int y){
- cnt=++tot;ls[cnt]=ls[pre];rs[cnt]=rs[pre];sum[cnt]=sum[pre]+y;
- if(l==r)return;
- int mid=(l+r)>>;
- if(mid>=x)upd(ls[cnt],ls[pre],l,mid,x,y);
- else upd(rs[cnt],rs[pre],mid+,r,x,y);
- }
- int query(int cnt,int l,int r,int L,int R){
- if(l>=L&&r<=R)return sum[cnt];
- int mid=(l+r)>>,ans=;
- if(mid>=L)ans+=query(ls[cnt],l,mid,L,R);
- if(mid<R)ans+=query(rs[cnt],mid+,r,L,R);
- return ans;
- }
- struct edge{int x,y;}b[N];
- int main(){
- n=rd();m=rd();k=rd();type=rd();
- for(int i=;i<=n;++i)f[i]=i;int x,y;
- for(int i=;i<=n;++i)a[i]=2e9;
- for(int i=;i<=m;++i){
- a[i+n]=i;
- x=rd();y=rd();T[i]=T[i-];b[i].x=x;b[i].y=y;
- if(x==y)continue;
- if(find(x)==find(y)){
- lct.split(x,y);
- int id=lct.tr[y];
- // lct.dfs(y);cout<<" ??? "<<x<<" "<<y<<" "<<id<<" "<<lct.findroot(y)<<endl;
- lct.cut(id,b[id-n].x);lct.cut(id,b[id-n].y);upd(T[i],T[i],,m,id-n,-);
- lct.link(x,i+n);lct.link(y,i+n);
- }else{
- lct.link(x,i+n);lct.link(y,i+n);
- int xx=find(x),yy=find(y);f[xx]=yy;
- }
- upd(T[i],T[i],,m,i,);
- }
- for(int i=;i<=k;++i){
- x=rd();y=rd();if(type)x^=ans,y^=ans;
- printf("%d\n",ans=n-query(T[y],,m,x,y));
- }
- return ;
- }
bzoj3514(LCT+主席树)的更多相关文章
- [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,代表点数.边数.询问数以及询问是否加密. 接下来 ...
- [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]
题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版(LCT + 主席树)
题意 \(N\) 个点 \(M\) 条边的无向图,询问保留图中编号在 \([l,r]\) 的边的时候图中的联通块个数. \(K\) 次询问强制在线. \(1\le N,M,K \le 200,000\ ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- BZOJ 3514 GERALD07加强版 (LCT+主席树)
题目大意:给定n个点m条边无向图,每次询问求当图中有编号为[L,R]的边时,整个图的联通块个数,强制在线 神题!(发现好久以前的题解没有写完诶) 我们要求图中联通块的个数,似乎不可搞啊. 联通块个数= ...
随机推荐
- VMware虚拟机中常见的问题汇总
在使用虚拟机进行开发工作的时候,经常会遇到各种各样的问题, 总结再次, 防微杜渐 1. wget: unable to resolve host address的解决方法 原因分析: DNS域名解析的 ...
- 初步了解HTTP
HTTP简介: HTTP:HyperText Transfer Protocol 超文本传输协议,是因特网上使用最为广泛的一种网络传输议,是用于从万维网(www :world wide web)服 ...
- Oracle行列转换case when then方法案例
select (select name from t_area where id=areaid) 区域, end) 一月, end) 二月, end) 三月, end) 四月, end) 五月, en ...
- Jenkins整合SonarQube代码检测工具
借鉴博客:https://blog.csdn.net/kefengwang/article/details/54377055 上面这博客写得挺详细的,挺不错.它这个博客没有提供下载的教程,这个博客提供 ...
- python之路--MySQL 库,表的详细操作
一 库操作 数据库命名规则 可以由数字,字母,下划线,@, #, $ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位 # 这些是对上次的补充. 二 ...
- spring boot 获取bean
在写测试用例的时候,如果是springboot的应该加上 springboot的标签: @SpringBootTest(classes = ApplicationLoader.class) @Acti ...
- Delphi窗体之间互相调用的简单问题
问题是这样的,我的程序主窗口Form1上面有一个数据连接(ADOCONNECTION1)和ADOQUERY,然后还有一些数据感知组件用于浏览用的,我打算点击From1中的一个“修改数据”按钮,就弹出F ...
- Java多线程之线程状态转换图
说明:线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...
- LODOP打印控件进行批量打印
Lodop打印控件批量打印的方式:1.批量打印每页内容相同的:(1)批量打印相同内容的很多纸张,可以设置打印份数,把该内容打印出多份.2.批量打印每页不同内容的:(1)通过在一个任务中分页,循环添加页 ...
- 如何安装或卸载Lodop、C-Lodop
安装:下载.exe安装文件,一步步安装就行,如不特意拦截,应该是100%可以安装成功.客户端本地打印角色等,直接一步步安装就行,如果是广域网AO打印那种,在服务器上安装的c-lodop,需要勾选服务器 ...