BZOJ 4668 LCT】的更多相关文章

思路: 这不是LCT裸题嘛23333 (好像并查集+按秩合并就可以搞了 我还是too young) 维护边权的话 就新加一个点 代表边 这个点想线段的两个端点连边就好了 //By SiriusRen #include <bits/stdc++.h> using namespace std; ; int n,m,op,xx,yy,top,lastans,T; ],q[N],maxx[N],rev[N],v[N],f[N]; ]!=x&&ch[fa[x]][]!=x;} ]],ma…
[BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与父亲相连.查询u,v的时候显然可以看出,答案就是u到v路径上的点tim的最大值.所以像求lca一样暴力向上跳就可以了.然后按秩合并,树高是\(O(\log n)\)的,所以每次查询是\(O(\log n)\)的 代码 #include<iostream> #include<cstdio>…
题目: [BZOJ 4668 冷战] 思路: 因为考虑强制在线,我们是肯定要维护形状的 我们发现如果\((u,v)\)这条边如果\(u,v\)已经连上,那么对于最终答案这条边是没有贡献的 所以我们发现其实我们最后要维护的是一棵树 因为没有拆边操作,我们用并查集维护就好了 然后计点权\(p(u)\)为\(u与fa(u)\)连上的时间 查询时查询\(p(lca(u,v))\)就可以了 代码 // code by Dix_ #include<bits/stdc++.h> #define ll lon…
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include <algorithm> #define N 1000004 #define lson t[x].ch[0] #define rson t[x].ch[1] #define setIO(s) freopen(s".in","r",stdin) using namesp…
Description 在一个图上,在两个点间连一条边,问这两个点最早在什么时候联通. Sol 并查集+启发式合并. 按秩合并的并查集...我也不知道什么是按秩合并,反正就跟启发式合并差不多,合并的时候将小的往大的里和,因为每次增长都是小集合倍数的两倍以上,所以层数不超过 \(log n\) 然后连边的时候记录一下是第几次连接的,统计一下深度,最后暴力找LCA... Code /***********************************************************…
#include <cstdio> ; inline void Get_Int(int & x) { ; ') ch=getchar(); +ch-'; ch=getchar();} } //======================================== ]; int n,m,u,v; struct Node; inline void Swap(Node *&x,Node *&y); struct Node { Node * pre,* ch[]; i…
LCT最基础的题,就用到了一个ACCESS操作 首先我们将这个绵羊弹飞的情况看成一颗树,那么假设X点被弹飞到 Y点,那么Y为X的父亲节点,弹飞的话父亲节点为n+1(虚设) 那么每个询问就是询问X点到根节点n+1的路径长度(节点数) 每个修改操作就是将以X为根节点的子树和X的父亲断开,连接到Y上 这样简单的维护森林连通性的问题,动态树中的LCT解决就行了 /************************************************************** Problem:…
大概题意:给一个无向图,有a,b两种边权,找一条从1到n的路径,使得max(a[i])+max(b[i])最小a[i],b[i]表示该路径上的边的对应权. 如果用类似最短路的DP来做,显然每个点的状态就必须是一个集合,保存的是一个下凸的点集,表示到达这个点的最小的a,b,这样肯定会挂,但该该种做法已经无法再优化或减少状态了. 考虑枚举其中一个权值b0,然后只考虑所有b权值小于等于b0的边,然后变成简单的问题,因为这个b0不满足二分三分之类的性质,所以肯定不能每次重建图,跑DP,最终的做法是从小到…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 不路径压缩,维护并查集的树的结构,查询链上最大值.按秩合并就可以暴爬. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; int n,m,fa[N],w[N],siz[N],tot,ans; int rd…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 按秩合并维护并查集的树结构,然后暴力找路径上的最大边权即可. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; int n,m,fa[xn],t[xn],dep[xn],siz[xn],ans…