BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作

BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作_第1张图片BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作_第2张图片BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作_第3张图片BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作_第4张图片


维护动态最大生成树

最开始YY了一个 线段树分治 kruskal重构树

然后觉得复杂度不对? 不过BJ对kruskal重构树也仅仅算理解 没写过。。

希望有人带带 QWQ 告诉我对不对、怎么做哦~


LCT维护最大生成树

加入一条边时

若两点未联通 直接加

否则找到两点路径上最小的边 看能不能替换掉


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using 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<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}

const int N=400100,inf=0X3f3f3f3f;

int n;

int fa[N],ch[N][2];
int mn[N],sum[N],tim[N],len[N];
bool rev[N];

inline bool isroot(int x)
{return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}

inline void pushup(int x)
{
	mn[x]=x;
	int ls=ch[x][0],rs=ch[x][1];
	if(ls && tim[mn[ls]]


你可能感兴趣的:(LCT,—————————高级数据结构)