名字感觉挺奇怪的。

考虑离线算法。首先答案就是用 \(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加强版 题解的更多相关文章

  1. 【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2023  Solved: 778 ...

  2. [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2177  Solved: 834 ...

  3. bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树

    Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1951  Solved: 746[Submi ...

  4. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...

  5. BZOJ3514 : Codechef MARCH14 GERALD07加强版

    以边编号为权值 用Link-cut Tree维护最大生成树 对于新加的第i条边(u,v) a[i]表示当a[i]这条边加入后连通块个数会减少 若u==v则a[i]=m 若u与v不连通则连上,a[i]= ...

  6. 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...

  7. BZOJ3514: Codechef MARCH14 GERALD07加强版【LCT】【主席树】【思维】

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...

  8. BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...

  9. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树

    自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...

  10. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

随机推荐

  1. 揭秘UGO SQL审核功能4大特性,让业务平滑迁移至GaussDB

    业务挑战 数据库是企业应用系统的核心,SQL作为数据库查询.更新等操作的标准语言,重要性不言而喻.然而在实际的SQL开发过程中,也面临着诸多挑战: 数据库应用开发人员的SQL能力良莠不齐,经常写出不符 ...

  2. 详解AQS二:ReentrantLock公平锁原理

    ReentrantLock作为我们使用频率最高的显式锁,它是AQS的经典实现,本篇文章将以ReentrantLock公平锁为例讲解AQS的实现. 一.ReentrantLock 在之前的文章<线 ...

  3. Windows的树形目录结构

    一.文件.文件夹(目录).逻辑盘.路径的概念 · 文件:是操作系统用来存储和管理信息的基本单位.每个文件都有一个名称,叫文件名.文件名通常由‌基本文件名和‌扩展名两部分组成,其中基本文件名用于说明文件 ...

  4. dockercompose配置ulimit

    在 Docker Compose 文件中设置 ulimit 的方法如下: 在 Docker Compose 文件的 services 块中,为您要设置 ulimit 的服务添加 ulimits 子块, ...

  5. 免费学习基于SpringBoot的高考志愿智能推荐系统

    免费学习基于SpringBoot的高考志愿智能推荐系统 摘要 科学技术日新月异,人们的生活都发生了翻天覆地的变化,高考志愿智能推荐系统管理当然也不例外.过去的信息管理都使用传统的方式实行,既花费了时间 ...

  6. 【杂谈】Kafka 消息偏移量:如何高效地定位和管理消息?

    前言 在 Kafka 中,消息偏移量是什么?是文件中的索引吗?又是如何通过偏移量快速定位消息的?本文将深入探讨这些问题,帮助你更好地理解 Kafka 的偏移量机制. Kafka 的偏移量是什么? Ka ...

  7. Qt开发经验小技巧256-260

    默认QDialog窗体右下角有个拉伸尺寸的手柄,通过它可以对窗体拉伸大小,这个控件很容易被遗忘但是又经常可以看到,他的名字叫QSizeGrip,可以通过setSizeGripEnabled来启用或者禁 ...

  8. Qt编写安防视频监控系统66-子模块10网页浏览

    一.前言 网页浏览模块,用于传入一个网页地址,打开对应的网页进行浏览,可用于网页展示信息,支持多个,可以自行增加,代码中演示了一个.此模块的用途属于添砖加瓦润色用的,比如有一个牛逼的3D网页,机器人. ...

  9. Qt编写安防视频监控系统54-轮询配置

    一.前言 视频监控系统中少不了用到视频轮询,按照设计的基本原则,先满足基本的用户需求,稳定跑起来,再去折腾更复杂的应用场景,于是本系统也做了个基本的视频轮询功能,可以设置轮询方案,给某个轮询方案设置轮 ...

  10. 跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序

    本文由竹子爱熊猫分享,原题"(十一)Netty实战篇:基于Netty框架打造一款高性能的IM即时通讯程序",本文有修订和改动. 1.引言 关于Netty网络框架的内容,前面已经讲了 ...