题面:

有 nnn 个点,有一个长度为 mmm 的边序列 AAA,qqq 次询问由这 nnn 个点和 Al,⋯,ArA_l,\cdots,A_rAl​,⋯,Ar​ 的边构成的图中的连通块数量。强制在线。

n,q≤105n,q\leq 10^5n,q≤105,m≤2×105m\leq 2\times 10^5m≤2×105。

题解:

在线也能把它搞成离线:枚举右端点 rrr 右移,并维护 A1,⋯,ArA_1,\cdots,A_rA1​,⋯,Ar​ 组成的以下标为边权的最大生成森林,以及一棵可持久化线段树维护每条边是否在生成树内。

然后询问的时候我们直接在可持久化线段树上问 A1,⋯,ArA_1,\cdots,A_rA1​,⋯,Ar​ 组成的最大生成森林中有多少条边编号在 [l,r][l,r][l,r] 内,即可得到 Al,⋯,ArA_l,\cdots,A_rAl​,⋯,Ar​ 的生成森林中边的数量。然后用点减边即可得到连通块数。

时间复杂度 O((m+q)log⁡m)O((m+q)\log m)O((m+q)logm)。

#include<bits/stdc++.h>#define N 1000010
#define M 2000010
#define INF 0x7fffffffusing namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^'0');ch=getchar();}return x*f;
}struct edge
{int u,l,r;
}e[M];int n,m,q,rt[M];
bool t;namespace Seg
{#define lc(u) ch[u][0]#define rc(u) ch[u][1]const int NN=10000000;int node,ch[NN][2],sum[NN];int copy(int lst){node++,lc(node)=lc(lst),rc(node)=rc(lst),sum[node]=sum[lst];return node;}void up(int u){sum[u]=sum[lc(u)]+sum[rc(u)];}void update(int &u,int lst,int l,int r,int x){u=copy(lst);if(l==r) return (void)(sum[u]^=1);int mid=(l+r)>>1;if(x<=mid) update(lc(u),lc(lst),l,mid,x);else update(rc(u),rc(lst),mid+1,r,x);up(u);}int query(int u,int l,int r,int ql){if(!u) return 0;if(ql<=l) return sum[u];int mid=(l+r)>>1,ans=0;if(ql<=mid) ans+=query(lc(u),l,mid,ql);return ans+query(rc(u),mid+1,r,ql);}#undef lc#undef rc
}namespace LCT
{#define lc(u) t[u].ch[0]#define rc(u) t[u].ch[1]const int NN=N+M;struct data{int val,pos;data(){};data(int _v,int _p){val=_v,pos=_p;}};bool operator < (const data &a,const data &b){return a.val<b.val;}struct Tree{int fa,ch[2];bool rev;data val,sum;}t[NN];int node;void up(int u){t[u].sum=min(t[u].val,min(t[lc(u)].sum,t[rc(u)].sum));}int newnode(int v){++node,t[node].val=data(v,node),up(node);return node;}void downn(int u){swap(lc(u),rc(u)),t[u].rev^=1;}void down(int u){if(t[u].rev) downn(lc(u)),downn(rc(u)),t[u].rev=0;}bool get(int u){return rc(t[u].fa)==u;}bool notroot(int u){return lc(t[u].fa)==u||rc(t[u].fa)==u;}void rotate(int u){int fa=t[u].fa,gfa=t[fa].fa; bool d1=get(u);if(notroot(fa)) t[gfa].ch[get(fa)]=u; t[u].fa=gfa;t[t[fa].ch[d1]=t[u].ch[d1^1]].fa=fa;t[t[u].ch[d1^1]=fa].fa=u; up(fa);}void splay(int u){static int sta[NN];int top=1,now=sta[top]=u;while(notroot(now)) sta[++top]=now=t[now].fa;while(top) down(sta[top]),top--;while(notroot(u)){int fa=t[u].fa;if(notroot(fa)) rotate((get(u)^get(fa))?u:fa);rotate(u);}up(u);}void access(int u){for(int y=0;u;y=u,u=t[u].fa)splay(u),rc(u)=y,up(u);}void makeroot(int u){access(u),splay(u),downn(u);}int findleft(int u){while(1){down(u);if(!lc(u)) return u;u=lc(u);}}int findroot(int u){access(u),splay(u);int rt=findleft(u);splay(rt); return rt;}data query(int u,int v){makeroot(u);if(findroot(v)!=u) return data(-1,114514);return t[u].sum;}void link(int u,int v){access(u),splay(u),makeroot(v);t[rc(u)=v].fa=u,up(u);}void cut(int u,int v){makeroot(v),makeroot(u);rc(u)=t[v].fa=0,up(u);}int update(int u,int v,int tim){rt[tim]=rt[tim-1];int now=newnode(tim);data ptim=query(u,v);if(ptim.val==-1){link(u,now),link(now,v);Seg::update(rt[tim],rt[tim],1,m,tim);}else if(tim>ptim.val){int id=ptim.pos-n;cut(e[id].l,e[id].u),cut(e[id].u,e[id].r);link(u,now),link(now,v);Seg::update(rt[tim],rt[tim],1,m,id);Seg::update(rt[tim],rt[tim],1,m,tim);}return now;}#undef lc#undef rc
}int main()
{//  freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);n=LCT::node=read(),m=read(),q=read(),t=read();for(int i=0;i<=n;i++) LCT::t[i].val=LCT::t[i].sum=LCT::data(INF,114514);for(int i=1;i<=m;i++){e[i].l=read(),e[i].r=read();e[i].u=LCT::update(e[i].l,e[i].r,i);}int lans=0;while(q--){int l=read(),r=read();if(t>0) l=(l+t*lans)%m+1,r=(r+t*lans)%m+1;if(l>r) swap(l,r);printf("%d\n",lans=(n-Seg::query(rt[r],1,m,l)));}return 0;
}
/*
3 3 3 0
1 2
2 3
1 3
1 1
2 2
2 3
*/
/*
4 5 114514 0
1 2
2 3
3 4
1 3
2 4
*/
/*
4 3 114514 0
1 2
2 3
3 4
*/

【P5385】【Cnoi2019】须臾幻境(LCT)相关推荐

  1. 【洛谷P5385】须臾幻境/【BZOJ3514】Codechef MARCH14 GERALD07加强版【LCT】【主席树】

    题意:有nnn个点mmm条边,qqq次询问连接区间[L,R][L,R][L,R]中的边后的连通块个数.强制在线. n,m,q≤2×105n,m,q\leq 2\times10^5n,m,q≤2×105 ...

  2. [Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)

    文章目录 title solution code title solution 一棵nnn个点的树有n−1n-1n−1条边. 一般的,对于森林而言则有点数-边数=树的个数 那么我们将无向图随便生成一个 ...

  3. 仙剑游戏系列..感想

    当然这篇文章的一切内容都是-个人感想 先说一说我个人认为的仙剑系列的巅峰-. 开山鼻祖,也足够成为永恒之经典的<仙剑奇侠传一> 确立仙剑三皇六界世界观的里程碑之作的<仙剑奇侠传三&g ...

  4. 神仙道装备材料及掉落地点大全

    神仙道最初级的紫装是逍遥套装,需要用10级的蓝色装备加上材料合成,之后更高等级的紫装都是由低一阶的紫装升级而来例如:60玄奇装备是40级朱雀装备加材料升级的.以下是详细的材料. 20级逍遥套装 武器: ...

  5. 《仙剑奇侠传四》完全攻略

    序章 看完游戏的开头动画,经过一番剧情之后呢,就可以开始云天河的冒险之旅啦! 可以自由行动之后,先进入云天河的家,按照剧情指示前往右下角的床上拿取猎弓与武器.(我在这边进门后直接往右上那个角落走,结果 ...

  6. 2019.03.01 bzoj2555: SubString(sam+lct)

    传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsa ...

  7. 洛谷.4234.最小差值生成树(LCT)

    题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...

  8. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  9. 当代艺术遇上虚拟现实:幻境视界打造基业VR美术馆

    VR展览也许并不少,但专业的艺术展却难得一见.幻境世界周志强希望能借助VR技术,实现"一地办展.全球同展.永不闭馆",更好地传播当代艺术. 从米开朗琪罗到库尔贝,再到雷诺阿,大师们 ...

  10. BZOJ2631tree——LCT

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

最新文章

  1. VS.NET 学习方法论
  2. vim插件推荐之auto-pairs
  3. 13.2.8 用户认证
  4. JSON字符串和对象 的转换
  5. 安装python3.6报错_CentOS 7下安装Python3.6 及遇到的问题小结
  6. python3安装模块的命令_如何为PythonPython3安装gi模块?
  7. 分子动力学模拟软件_分子模拟软件Discovery Studio教程(十三):构建PLS模型(3D-QSAR)...
  8. mybatis jar包_Spring4+SpringMVC+MyBatis整合思路
  9. NoSQL之【MongoDB】学习(二):DML和查询操作说明
  10. spring-boot报错循环注入报错:has been injected into other beans
  11. L1-016 查验身份证 (15 分) — 团体程序设计天梯赛
  12. csv反序列化_Py't'hon之csv,ini序列化,反序列化
  13. unix编程实训教程之 more(觉醒篇一 Begin)
  14. 什么是MySQL集群?带你全面掌握MySQL集群原理
  15. 计算机显卡驱动全部卸载,怎么卸载显卡驱动
  16. Oracle VM VirtualBox 使用教程,说实话也就那样吧
  17. 使用CANoe进行Panel设计
  18. 计算机学感悟,计算机学习感悟
  19. 从 KPI 到 OKR,高阶产品人如何推动业务高速增长
  20. 天平游码读数例题_托盘天平游码读数方法及使用口诀 | | 化工资讯网

热门文章

  1. IDE工具、文本编辑器的列块编辑模式
  2. 我和数据类型抗争的血泪史(二十五分钟)
  3. Codeforces - Inna and Dima
  4. go 语言最详细的入门教程
  5. python 中搞错工作路径的意思导致的相对路径产生bug:[Errno 2] No such file or directory:
  6. 使用html2canvas实现超出浏览器部分截图
  7. 期权、期货及其他衍生产品 第一章 课程笔记整理
  8. [2019][CVPR]Balanced Self-Paced Learning for Generative Adversarial Clustering Network 笔记
  9. 商汤AR开发之旅(1)-- 关于SenseAR SDK
  10. First non-repeating character