BZOJ3302: [Shoi2005]树的双中心】的更多相关文章

BZOJ3302: [Shoi2005]树的双中心 https://lydsy.com/JudgeOnline/problem.php?id=3302 分析: 朴素算法 : 枚举边,然后在两个连通块内部找到带权重心计算答案. 然后我们发现在内部找重心是方向唯一,因此可以预处理出来这个点向下走的最优儿子和次优儿子. 然后每次从上往下找重心即可. 时间复杂度\(O(n\times dep)\). 代码: #include <cstdio> #include <cstring> #inc…
[BZOJ3302][Shoi2005]树的双中心 Description Input 第一行为N,1<N<=50000,表示树的节点数目,树的节点从1到N编号.接下来N-1行,每行两个整数U,V,表示U与V之间有一条边.再接下N行,每行一个正整数,其中第i行的正整数表示编号为i的节点权值为W(I),树的深度<=100 Output 将最小的S(x,y)输出,结果保证不超过19^9 Sample Input 5 1 2 1 3 3 4 3 5 5 7 6 5 4 Sample Outpu…
SHOI2005 树的双中心 给树 \(T=(V,E)(|V|=n)\),树高为 \(h\),\(w_u(u\in V)\).求 \(x\in V,y\in V:\left(\sum_{u\in V}w_u\cdot \min(dis_{u,x},dis_{u,y})\right)_{\min}\). 数据范围:\(1\le n\le 50000\),\(1\le h\le 100\). 一眼思路:把 \(T\) 由一条边砍成 \(T_1,T_2\),\(x\) 为 \(T_1\) 重心,\(y…
[题意]给定带点权树,要求选择两个点x,y,满足所有点到这两个点中较近者的距离*点权的和最小.n<=50000,h<=100. [算法]树的重心 [题解]代码参考自:cgh_Andy 观察要求容易发现和重心的定义[所有点距离和最小]十分相似. 要把树分成两部分,于是考虑枚举割掉一条边后,在两棵树中各自找重心. 这样做得到的方案虽然不一定满足题意,但最优解一定在方案中,且不满足题意的方案一定不会比最优解小. 用树形DP求重心,总复杂度O(n^2). 观察到最大深度<=100,可以用[往子树…
传送门 强行安利->巨佬题解 如果只有一个点贡献答案,那么答案显然是这棵树的带权重心,这个是可以\(O(n)\)求的.一个\(O(n^2)\)暴力是枚举两个集合之间的分界边,然后对这两个集合分别算答案,合并更新 考虑优化此过程,一个结论是一棵树内,只有\(size_i*2>size_{root}\)的点才有可能成为带权重心,并且这一类点个数不超过2个 不会证啊qwq,感性理解一下吧.所以每次枚举是哪条边为分界线,然后把树分成两部分,从每个树的根开始算答案,如果\(size_i*2\le siz…
先考虑一个\(O(N^2)\)做法. 设选的两个点为\(x,y\),则一定可以将树分成两个集合\(A,B\),使得\(A\)集合所有点都去\(x\),\(B\)集合所有点都去\(y\),而这两个集合的分界点就是树上的一条边.于是考虑枚举断哪条边,然后对两边分别跑一遍带权树的重心,统计答案加起来取最小值就行了. 现在进行优化,求树的重心的方法可以参考医院设置. 以\(1\)为根建树,\(f[u]\)表示所有点到\(u\)的总距离.(人数乘以距离) 转移方程是: \[f[v]=f[u]+size[1…
题目链接:Click here Solution: 首先我们要知道,选择两个点\(A,B\),必定存在一条边,割掉这条边,两个集合分别归\(A,B\)管 再结合题目,我们就得到了一个暴力的\(n^2\)做法:枚举个每条边,分别对两棵树求带权重心,更新答案 但这显然是过不了这道题的,考虑对求带权重心的过程进行优化: 设\(d(x)\)为\(x\)所在集合内所有点到他的距离之和,\(sz(x)\)表示以\(x\)为根的子树的大小,我们可以得到: \[ d(v)=d(u)+sz(rt)-sz(v)-s…
题目: 题解: bzoj 3302 == 2447 == 2103 三倍经验 首先我们考虑枚举两个中心的位置,然后统计答案. 我们发现,一定有一部分点离第一个中心更近,另一部分点离第二个中心更近 如果将两部分点分别染成两种颜色,容易发现一定有且只有一条边两端的颜色不相同 所以我们考虑枚举这条边,然后将整个树分成两个部分,然后分别求出分开的两颗树的中心,然后把两部分的代价求和来更新答案. 容易发现这样是\(n^2\)的 然后我们回头看题目,发现有奇怪的条件:深度 <= 100 这启发了我们从深度的…
Trie树 原理 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,能在常数时间O(len)内实现插入和查询操作,是一种以空间换取时间的数据结构,广泛用于词频统计和输入统计领域. 来看看Trie树长什么样,我们从百度找一张图片: 字典树在查找时,先看第一个字是否在字典树里,如果在继续往下,如果不在,则字典里不存在,因此,对于一个长度为len的字符串,可以在O(len)时间内完成查询. 实现trie树 怎…
#coding=utf- #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(). ''' Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值. 说清楚就是:如果这个键存在字典中,那么这句话就不起作用,否则就添加字典里面这个key的取值为后面的默认值. 简化了字典计数的代码.并且这个函数的返回值是做完这些事情之后这个key的value值. dict.setde…