题目大意:给出一棵树,每一个节点有两个值,分别是这个忍者的薪水和忍者的领导力。客户的满意程度是这个点的领导力乘能够取得人数,前提是取的人的薪水总和不超过总的钱数。
思路:只能在子树中操作,贪心的想,我们只要这个子树中cost最小的那些点就可以了。所以就深搜一次,每到一个节点上,把自己和所有子节点的平衡树启发式和并,然后保留不超过总钱数的人数,统计。数据范围比较大,能开long long的...
题目大意:给定一个无向图以及n个点的排名,多次连接一条边,多次求某个点所在联通块中排名第k小的点的编号
初始对于每个点建立一棵只有一个节点的Treap,然后每次连接两个点,利用并查集找到两个点的根节点,将size较小的Treap暴力拆解插入大的中,然后将小的并查集合并到大的中
今天下午各种脑残,一个小小的Treap改了不下10遍0.0 快去喝脑白金0.0
#include
#include
...
分类:
其他好文 时间:
2014-10-23 17:42:12
阅读次数:
228
题目大意:给出一个森林,每个节点都有一个权值。有若干加边操作,问两点之间路径上的第k小权值是多少。
思路:这题和COT1比较像,但是多了连接操作。这样就只能暴力合并连个树。启发式合并会保证时间复杂度不至于太大。然后就是用可持久化线段树维护一个树的信息,按照dfs序来建树,每个节点的可持久化链的参考版本就是它父亲的版本。之后利用权值线段树可区间加减的特性,用f[x] + f[y] - f[...
分类:
其他好文 时间:
2014-10-21 10:26:39
阅读次数:
265
题目大意:同3673 强制在线
同3673 只不过慢了一些0.0
这道题只写路径压缩比只写启发式合并要快一点点 两个都写就慢的要死0.0
改代码RE的可能是内存不够
#include
#include
#include
#include
#define M 200200
using namespace std;
struct Tree{
Tree *ls,*rs;
int num;
}...
分类:
其他好文 时间:
2014-10-20 19:30:35
阅读次数:
164
题目大意:给定一棵森林,每个点有权值,提供两种操作:
1.查询两点间路径上第k小的权值
2.将两个点之间连一条边 保证连接后仍是一座森林
可持久化线段树部分同Count On A Tree 只是这道题加了个连接操作
对于连接操作我们要用到启发式合并 就是把小的那棵树暴力重建 很简单的一个操作但是可以证明是均摊O(nlogn)的
大小我用了并查集 其实记录根就可以了
此外本题的多组数据是...
分类:
其他好文 时间:
2014-10-20 13:36:39
阅读次数:
291
题目大意:有一些岛屿,一开始由一些无向边连接。后来也有不断的无向边加入,每一个岛屿有个一独一无二的重要度,问任意时刻的与一个岛屿联通的所有岛中重要度第k大的岛的编号是什么。
思路:首先连通性一定要用并查集维护,然后就是联通快内的第k大问题,显然是平衡树。但是并查集的合并怎么搞?可以考虑按秩合并,这样的话就保证每次在平衡树中处理的元素尽量的少,就可以水过这个题了。
注意一下输出-1的判断...
分类:
其他好文 时间:
2014-10-17 12:03:21
阅读次数:
198
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029Problem DescriptionThe soil is cracking up because of the drought and the rabbit kingdom is facing ...
分类:
其他好文 时间:
2014-09-22 02:39:21
阅读次数:
291
用并查集维护联通性。对每个联通块维护一个平衡树。合并时启发式合并。比较懒,用了pb_ds。 1 #include 2 #include 3 #include 4 using namespace std; 5 using namespace __gnu_cxx; 6 using namespace _...
分类:
其他好文 时间:
2014-09-13 10:32:35
阅读次数:
180
Codeforces Round #263 (Div. 1)
A:贪心,排个序,然后从后往前扫一遍,计算后缀和,之后在从左往右扫一遍计算答案
B:树形DP,0表示没有1,1表示有1,0遇到0必然合并,0遇到1也必然合并,1遇到0必然合并,1遇到1,必然切断,按照这样去转移即可
C:树状数组,再利用启发式合并,开一个l,r记录当前被子左右下标,和一个flip表示是否翻转
代码...
分类:
其他好文 时间:
2014-08-30 12:38:09
阅读次数:
281
原先就看过这道题,觉得很复杂。不知道为什么今天一看觉得好水啊……难道这就是并查集的启发式合并?数组d【i】表示i到其父节点的距离,即中间隔了多少船舰。数组sum【i】记录以i为根的集合总共有多少个元素,将新节点插入的时候距离设为sum【i】就好了。代码:
1 var fa,d,sum:array[....
分类:
其他好文 时间:
2014-06-12 09:45:29
阅读次数:
145