[BZOJ3514] [Codechef MARCH14] GERALD07加强版 题解
名字感觉挺奇怪的。
考虑离线算法。首先答案就是用 \(n\) 减去连完边后的生成树森林边数。生成树当然就可以用 \(lct\) 求解了。我是不会告诉你这个时候我已经开始想回滚莫队了的。
考虑当我们倒序加入 \([l,r]\) 中的边时,哪些边会产生贡献。我们考虑假如我们新加入一条边,与原先的生成树形成了环,那么这个环中编号最小的那条边 \(y\) 加入时,就一定不会产生贡献。所以我们可以用线段树维护区间和,在每个询问的右端点处解决这个询问。当我们遍历到一个点 \(x\) 时,我们让 \(x\) 位置的贡献为 \(1\),让 \(y\) 位置的贡献为 \(0\),就可以 \(O(n\log n)\) 的求解了。
那么就好说了,既然是在线,直接用可持久化线段树预处理即可。
时间复杂度 \(O(n\log n)\)。
#include<bits/stdc++.h>
#define fa(x) lct[x].fa
#define fl(x) lct[x].fl
#define id(x) lct[x].id
#define sn(x,i) lct[x].sn[i]
using namespace std;
const int N=4e5+5,M=N*25;
struct node{
int sn[2],fa,fl,id;
}lct[N];int n,la,m,flag,tot;
int k,tp,rt[N],sum[M],ls[M];
int u[N],v[N],st[N],rs[M];
int check(int x){
return sn(fa(x),0)!=x&&sn(fa(x),1)!=x;
}int chksn(int x){
return sn(fa(x),1)==x;
}void push_up(int x){
id(x)=min({id(sn(x,0)),id(sn(x,1)),x});
}void push_down(int x){
if(!x||!fl(x)) return;
fl(sn(x,0))^=1,fl(sn(x,1))^=1;
swap(sn(x,0),sn(x,1)),fl(x)=0;
}void rotate(int x){
int y=fa(x),z=fa(y),k=chksn(x);
if(!check(y))
sn(z,chksn(y))=x;
fa(x)=z,fa(y)=x,fa(sn(x,1-k))=y;
sn(y,k)=sn(x,1-k),sn(x,1-k)=y;
push_up(y);
}void splay(int x){
st[tp=1]=x;
for(int i=x;!check(i);i=fa(i)) st[++tp]=fa(i);
while(tp) push_down(st[tp--]);
while(!check(x)){
int y=fa(x),z=fa(y);
if(!check(y))
rotate(chksn(x)!=chksn(y)?x:y);
rotate(x);
}push_up(x);
}void access(int x){
for(int i=0;x;i=x,x=fa(x))
splay(x),sn(x,1)=i,push_up(x);
}int find(int x){
access(x),splay(x);
while(sn(x,0)) x=sn(x,0);
return x;
}void mk(int x){
access(x),splay(x),fl(x)^=1;
}void split(int x,int y){
mk(x),access(y),splay(y);
}void cut(int x,int y){
split(x,y),sn(y,0)=fa(x)=0;
}void link(int x,int y){
mk(x),access(y),fa(x)=y;
}void add(int &x,int y,int l,int r,int k,int ad){
x=++tot,sum[x]=sum[y]+ad;
if(l==r) return;int mid=(l+r)/2;
ls[x]=ls[y],rs[x]=rs[y];
if(k<=mid) add(ls[x],ls[y],l,mid,k,ad);
else add(rs[x],rs[y],mid+1,r,k,ad);
}int gsum(int x,int l,int r,int L,int R){
if(!x||L<=l&&r<=R) return sum[x];
int mid=(l+r)/2,re=0;
if(L<=mid) re=gsum(ls[x],l,mid,L,R);
if(R>mid) re+=gsum(rs[x],mid+1,r,L,R);
return re;
}void ad(int x){
if(u[x]==v[x])
return rt[x]=rt[x-1],void();
add(rt[x],rt[x-1],1,m,x,1);
if(find(u[x]+m)!=find(v[x]+m))
return link(u[x]+m,x),link(x,v[x]+m);
split(u[x]+m,v[x]+m);int idx=id(v[x]+m);
cut(u[idx]+m,idx),cut(idx,v[idx]+m);
link(u[x]+m,x),link(x,v[x]+m);
add(rt[x],rt[x],1,m,idx,-1);
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k>>flag,id(0)=1e9;
for(int i=1;i<=n+m;i++) id(i)=i;
for(int i=1;i<=m;i++)
cin>>u[i]>>v[i],ad(i);
while(k--){
int l,r;cin>>l>>r;if(flag) l^=la,r^=la;
cout<<(la=n-gsum(rt[r],1,m,l,r))<<"\n";
}return 0;
}
[BZOJ3514] [Codechef MARCH14] GERALD07加强版 题解的更多相关文章
- 【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2023 Solved: 778 ...
- [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预处理+主席树
Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1951 Solved: 746[Submi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...
- BZOJ3514 : Codechef MARCH14 GERALD07加强版
以边编号为权值 用Link-cut Tree维护最大生成树 对于新加的第i条边(u,v) a[i]表示当a[i]这条边加入后连通块个数会减少 若u==v则a[i]=m 若u与v不连通则连上,a[i]= ...
- 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版
来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版【LCT】【主席树】【思维】
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树
自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树
题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...
随机推荐
- Vue.js 文本行滚动
1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...
- 调用xlst执行转换
try { //Create a new XslTransform object. XslCompiledTransform xslt = new XslCompiledTransform(); // ...
- C++ builder 10.2 x64程序使用typeid获取vcl类名时异常
C++ builder 10.2 x64程序使用typeid获取vcl类名时异常 比如: const std::type_info &t= typeid(TForm1); 那么t的name() ...
- 鸿蒙UI开发快速入门 —— part08: 组件状态管理之@Provide/@Consume装饰器
1.说在前面的话 在此之前,我们已经先后学习了三个装饰器:@State.@Props.@Link,它们的功能和使用场景分别是什么?暂停会议一下. 我们目前已经可以处理组件内状态(@State),也可以 ...
- 覆盖全品类数据,腾讯云COS内容审核全新上线
今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...
- Qt编写地图综合应用48-地球模式、三维模式、地铁模式
一.前言 百度地图本身提供了普通模式.地球模式.三维模式.地铁模式等好多种,普通模式是最常用的默认的,就是那个街道图和卫星图的,而地球模式和三维模式是最近几年才新增加的,为了迎合现在越来越多的用户的需 ...
- [转]vue项目中app.vue 、main.js和 index.html的关系
参考链接: 1.vue项目中app.vue .main.js和 index.html的关联 2.Vue中index.html.main.js.App.vue,之间关系 3.关于Vue中main.js, ...
- [转]IDEA2020.2.3中创建JavaWeb工程的完整步骤记录
原文链接: IDEA2020.2.3中创建JavaWeb工程的完整步骤记录
- 记录下uniapp的请求封装
请求封装就是经常见的事但是从来没有记录过,今天来记录一下简单的封装 首先封装自己的域名,可以和封装写在一起,但是最好单独写一个独立的js文件 这边就以一个域名为例 let baseUrl='域名地址' ...
- Solution Set -「NOIP Simu.」20221008
\(\mathscr{A}\sim\)「CF 1680E」Moving Chips Link & Submission. Tag:「水题无 tag」 温暖签到惹, DP 一下就好了 ...