启发式合并
gjghfd
这个作者很懒,什么都没留下…
展开
-
codeforces768G The Winds of Winter -- 树上启发式合并
题目链接题目大意:给定一棵树,对于树上每个结点,将它删去,然后你可以将得到的森林中任意一棵树的一个点与其父亲断开并连接到另一颗树上。求森林中所有树sizesize最大值的最小值。先考虑怎么求一个点的答案。令sizeisize_i表示点ii的子树和,minmin表示森林中最小的树的大小,maxmax表示森林中最大的树的大小。那么我们可以二分答案ansans,问题就转化为最大的树中是否存在一个点ii,使原创 2017-07-11 17:25:51 · 889 阅读 · 0 评论 -
codeforces600E Lomsat gelral -- 树上启发式合并
显然加入和删除点可以O(1)O(1)维护。先做一次树剖,然后从根开始dfsdfs一遍。dfsdfs到一个点时加入答案。对于每个点如果是轻儿子回溯时删除,否则不删除。统计答案时暴力dfsdfs一遍所有轻儿子。原创 2017-07-10 17:02:44 · 486 阅读 · 0 评论 -
[ 网络流 树上启发式合并 主席树 ] BZOJ3681
题解#include<bits/stdc++.h> using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void原创 2017-10-11 21:37:03 · 401 阅读 · 0 评论 -
[ 树上启发式合并 线段树 单调栈 ] BZOJ5040
可以用单调栈或线段树建出树,然后dsu on tree就好了。#include<bits/stdc++.h> using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==原创 2017-12-26 13:39:25 · 407 阅读 · 0 评论 -
[ 后缀自动机 树上启发式合并 线段树 树状数组 ] [ 雅礼集训 2017 Day7 ] LOJ#6041
对原串建后缀自动机,222 个前缀的最长公共后缀就是其反串的后缀树中对应点的 lcalcalca 的 lenlenlen 值。 现在问题转化为:给定一棵树,求编号在 [l,r][l,r][l,r] 的 222 个点的 lcalcalca 的最大深度。 考虑一个暴力的做法:枚举树上每个点作为 lcalcalca ,将其子树中所有点按编号排序,那么对于每个点,离它最近的 222 个点一定是最优的,...原创 2018-03-07 07:05:28 · 431 阅读 · 0 评论