题面

考虑没有询问,直接给你一个图问联通块怎么做。

并查集是吧。

现在想要动态地做,那么应该要用LCT。

考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通。

如果联通了,应该会形成一个环,我们其实可以把环中最早加进来的边删掉再加进来这条边,也不影响整个的联通性对不对。

于是我们用LCT维护一下最大生成树,顺便求出一个\(pre[i]\)表示\(i\)这条边加进来以后,环里面最早加进来的边的编号。

可以发现\(pre[i]\leq l\)那就说明,\(i\)这条边是连接了联通块的。\(l..r\)的区间内,有一个这样的边,就会少一个联通块。

这个用主席树维护就好了。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define lc t[o].c[0]
#define rc t[o].c[1]
#define REP(i,a,n) for(register int i(a);i<=(n);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
const int SZ=(1<<21)+1;char ibuf[SZ],*iS,*iT,obuf[SZ+128],*oS=obuf,*oT=obuf+SZ-1;
#ifdef ONLINE_JUDGE
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SZ,stdin),(iS==iT?EOF:*iS++)):*iS++)
#else
#define gc() getchar()
#endif
template<typename I>inline void read(I&x){char c=gc();int f=1;for(;c<'0'||c>'9';c=gc())c=='-'?f=-1:0;for(x=0;c>='0'&&c<='9';c=gc())x=(x<<1)+(x<<3)+(c&15);f==-1?x=-x:0;}
inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
#define printf(...) oS>oT&&(flush(),1),oS+=sprintf(oS,__VA_ARGS__)
template<typename A,typename B>inline char SMAX(A&a,const B&b){return a<b?a=b,1:0;}
template<typename A,typename B>inline char SMIN(A&a,const B&b){return a>b?a=b,1:0;}const int N=200000+7,INF=0x3f3f3f3f;
int n,m,x,y,Q,tp,la;
struct Edges{int x,y;}e[N];struct LCT{struct Node{int min,c[2],fa,rev;inline Node():min(INF){}}t[N<<1];int S[N<<1],top,nod;inline Node&operator[](const int&x){return t[x];}inline char Isroot(int o){return t[t[o].fa].c[0]!=o&&t[t[o].fa].c[1]!=o;}inline char Identify(int o){return t[t[o].fa].c[0]!=o;}inline void Connect(int fa,int o,char d){t[fa].c[d]=o;t[o].fa=fa;}inline void Pushup(int o){t[o].min=o>n?o:INF;lc&&SMIN(t[o].min,t[lc].min);rc&&SMIN(t[o].min,t[rc].min);}inline void Rotate(int o){int fa=t[o].fa,pa=t[fa].fa,d1=Identify(o),d2=Identify(fa),b=t[o].c[d1^1];!Isroot(fa)&&(t[pa].c[d2]=o);t[o].fa=pa;Connect(fa,b,d1);Connect(o,fa,d1^1);Pushup(fa),Pushup(o);}inline void Pushdown(int o){t[o].rev&&(t[o].rev=0,lc&&(t[lc].rev^=1,std::swap(t[lc].c[0],t[lc].c[1]),1),rc&&(t[rc].rev^=1,std::swap(t[rc].c[0],t[rc].c[1]),1));}inline void Splay(int o){int x=o;S[top=1]=x;while(!Isroot(x))S[++top]=x=t[x].fa;while(top)Pushdown(S[top--]);while(!Isroot(o)){int fa=t[o].fa;if(Isroot(fa))Rotate(o);else if(Identify(o)==Identify(fa))Rotate(fa),Rotate(o);else Rotate(o),Rotate(o);}}inline void Access(int o){for(register int x=0;o;o=t[x=o].fa)Splay(o),rc=x,Pushup(o);}inline void Makeroot(int o){Access(o);Splay(o);t[o].rev^=1;std::swap(lc,rc);}inline int Findroot(int o){Access(o);Splay(o);while(lc)Pushdown(o),o=lc;Splay(o);return o;}inline void Split(int x,int y){Makeroot(x);Access(y);Splay(y);}inline void Link(int x,int y){Makeroot(x);if(Findroot(y)^x)t[x].fa=y;}inline void Cut(int x,int y){Split(x,y);if(t[y].c[0]&&!t[x].c[1])t[y].c[0]=t[x].fa=0;Pushup(y);}//错误笔记: 清错了,把t[x].c[0]清零了
}lct;
#undef lc
#undef rc
struct President_Tree{struct Node{int lc,rc,val;}t[N*21];int rt[N],nod;inline void Insert(int &o,int p,int L,int R,int x,int k){t[o=++nod]=t[p];t[o].val+=k;if(L==R)return;int M=(L+R)>>1;x<=M?Insert(t[o].lc,t[p].lc,L,M,x,k):Insert(t[o].rc,t[p].rc,M+1,R,x,k);}inline int Query(int o,int p,int L,int R,int x){if(L==R)return t[o].val-t[p].val;int M=(L+R)>>1;return x>M?t[t[o].lc].val-t[t[p].lc].val+Query(t[o].rc,t[p].rc,M+1,R,x):Query(t[o].lc,t[p].lc,L,M,x);}
}pt;int main(){read(n),read(m),read(Q),read(tp);REP(i,1,m){read(x),read(y);int pre=x==y?m:0,p;e[i]=Edges{x,y};//错误笔记:自环需要特判掉 if(x!=y&&lct.Findroot(x)==lct.Findroot(y))lct.Split(x,y),p=lct[y].min,pre=p-n,lct.Cut(p,e[p-n].x),lct.Cut(p,e[p-n].y);if(x!=y)lct[i+n].min=i+n,lct.Link(x,i+n),lct.Link(y,i+n);pt.Insert(pt.rt[i],pt.rt[i-1],0,m,pre,1);//错误笔记:注意边权和点权之间要用+-n来切换}REP(i,1,Q){read(x),read(y);if(tp)x^=la,y^=la;printf("%d\n",la=n-pt.Query(pt.rt[y],pt.rt[x-1],0,m,x-1));//错误笔记:漏强制在线 }return flush(),0;
}

转载于:https://www.cnblogs.com/hankeke/p/BZOJ3514.html

BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树相关推荐

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

    [BZOJ3514]Codechef MARCH14 GERALD07加强版 Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行 ...

  2. BZOJ 3514 Codechef MARCH14 GERALD07 加强版 LCT+主席树

    题意: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 分析: 据说有dalao会离线做这题? 看到L和R就能想到主席树?dalao们太强了-- 如果我们给出n个点,m ...

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

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

  4. bzoj3514: Codechef MARCH14 GERALD07加强版

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3514 思路:这题思路很巧妙 首先每个连通块只要保留一棵生成树的边就可以保证连通了 把每条边的 ...

  5. 【洛谷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 ...

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

    Time:2016.08.06 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 今天模拟题T3 结果是看都没看?? n,m<=1000 每次直接暴力并查集,O(n)判断 复杂度 ...

  7. 【bzoj3514】 Codechef MARCH14 GERALD07加强版

    http://www.lydsy.com/JudgeOnline/problem.php?id=3514 (题目链接) 题意 给出$n$个点$m$条边的无向图,询问保留图中编号在$[l,r]$的边的时 ...

  8. 2017.10.17 Codechef MARCH14 GERALD07加强版 失败总结

    以前做这个题简直是噩梦的难度 有个很神的做法就是 利用最简联通形式来统计联通块 把一个要求的区间写成一颗等价的树,,就有了统一的标准 然后考虑怎么构造这棵树,看每次加入的边,如果已经联通,则考虑把这个 ...

  9. BZOJ 3514 Codechef MARCH14 GERALD07加强版

    从CC抠的题 xyz大神直接用分块秒 虽然会MLE+TLE 时限被改成40s了,我觉得30s足够了吧-- 考虑从左至右加入每一条边,加入某条边成环的环那么这条边对答案就没有影响.那么只要环上标号最小的 ...

最新文章

  1. Python 判断当前数值的类型(比如x=10 获取x的类型)
  2. android屏幕关闭屏幕,如何在设备进入睡眠模式(屏幕关闭)时显示屏幕android?...
  3. Linux 上的高可用中间件
  4. 不越狱无硬件,轻松搞定iPhone投影与录屏
  5. 结对-人机对战象棋游戏-开发过程
  6. Java中的事务——全局事务与本地事务
  7. SAP License:雾里看花系列——SAP顾问应该脱离”保姆”的角色
  8. 在线GIF图片帧拆分工具
  9. 职场三剑客,助你从容闯职场
  10. linux cpu驱动程序,Linux kernel-CPU 调频
  11. 光域网(IES)在Unity3d中的应用【2020】
  12. vb连接mysql的方法_VB几种连接数据库的方法
  13. 实用供暖通风空调设计手册 第三版_从设计到施工,设计师必知的工艺材料知识都在这里!...
  14. mencoder 转换rmvb格式为avi格式
  15. 统计学_显著性检验综述
  16. 公众号管理系统 v1.0.0
  17. linux驱动篇-touchscreen-精简版
  18. iOS读取通讯录功能
  19. 2016.06工作日志
  20. 在pcb布线中,要使拐角成圆弧形,应该怎么设置

热门文章

  1. 子div用了float浮动之后,如何撑开父元素,让父元素div自动适应高度的问题
  2. 开园第一篇献给找不回来的园子。。
  3. 图的广度优先搜索遍历
  4. layui 传递前端请求_前端请求后端,后端查询完毕传到前端 ,用layui 将 数据分页...
  5. python数据类型-元组(tuple)
  6. pe常用软件_装机不求人之打造自己的全功能PE系统维护优盘
  7. h5 ios 滚动到底部_分享iOS平台使用H5原生滚动的下拉刷新功能v1.0.0 [不推荐]
  8. git clone 出现fatal: unable to access ‘https://github 类错误解决方法
  9. Layer2匿名交易协议ZKCHAOS与跨链资产桥ChainSwap合作促进跨链隐私保护
  10. 数据:以太坊2.0合约余额新增6976 ETH