启发式合并
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[省选联考 2020 A 卷] 树
一、题目点此看题二、解法终于吧咕的这道题补回来了,考虑搞一个数据结构,我们需要维护:支持单点插入支持启发式合并支持统计异或和支持全局+1+1+1发现只有第四个不会做,那就搞它,考虑+1+1+1的意义在二进制下的意义是把末尾一段连续的111删去,把前面的000设置成111,发现这样可以通过tiretiretire树交换子树来做,但是细节不是很清楚。考场上我想到这一点就止步了,原因是我的tiretiretire树是从大到小建的(指二进制位的顺序),但是如果我们从小到大建出这颗tiretir原创 2020-07-31 11:46:18 · 238 阅读 · 2 评论 -
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
一、题目点此看题二、解法可以把颜色的出现情况压缩成一个二进制,然后处理出每个点到根的异或和,一条路径的异或和就是d[u]⊕d[v]d[u]\oplus d[v]d[u]⊕d[v],然后就用树上启发式合并就行了,合并之前先询问,询问时可以允许至多一位上是奇数。#include <cstdio>#include <vector>#include <iostream>using namespace std;const int M = 500005;int re原创 2020-06-04 20:38:20 · 214 阅读 · 0 评论 -
CF208E Blood Cousins
一、题目点此看题二、解法讲一下树上启发式合并,核心思路就是保留继承重儿子的信息,其他重新跑,时间复杂度是O(nlogn)O(n\log n)O(nlogn),给出证明。根到一个点最多经过log\loglog条轻边,因为每次经过一次轻边点数至少减半,然而一个点被重新统计的次数是路径上轻边的个数+1,不难发现这样的总复杂度是O(nlogn)O(n\log n)O(nlogn),然后这道题维护一个深度的次数统计即可。#include <cstdio>#include <vect原创 2020-06-02 16:28:30 · 125 阅读 · 0 评论 -
[POJ 1741] Tree
一、题目点此看题题目描述给一个nnn个点的数,找出多少点对(u,v)(u,v)(u,v)(u<vu<vu<v)的距离不大于kkk二、解法可以用启发式合并,我写的是无旋treaptreaptreap,康康代码吧。#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;const int M = 100005;int read(){ i原创 2020-06-01 16:31:33 · 131 阅读 · 0 评论 -
[POI2011] Tree Rotations
一、题目点此看题解释一下这个输入,如果值为000那么递归地给出它的子树,否则给出叶子的权值。二、解法总的逆序对就等于所有子树的逆序对之和,而子树内的选择对子树外的选择没有影响,这给了我们贪心的可能,考虑换更好还是不换更好,维护一个权值线段树,在启发式合并的时候再统计换的个数和不换的个数。#include <cstdio>#include <iostream>using namespace std;#define ll long longconst int M = 2原创 2020-05-29 21:08:00 · 180 阅读 · 0 评论 -
[HNOI2009]梦幻布丁
一、题目点此看题二、解法可以把颜色的修改看做合并,那么我们用启发式合并即可,用链表维护,时间复杂度O(nlogn)O(n\log n)O(nlogn)#include <cstdio>#include <iostream>using namespace std;const int M = 1000005;int read(){ int num=0,flag=1;char c; while((c=getchar())<'0'||c>'9'原创 2020-05-29 12:20:29 · 237 阅读 · 0 评论 -
Treediff
一、题目题目描述nnn个点的树,有mmm个叶子结点,只有叶子结点有权值,问每一个非叶节点的子树内选两个不同的叶子的最小差,如果不存在输出231−12^{31}-1231−1数据范围1≤m<n≤500001\leq m<n\leq 500001≤m<n≤50000二、解法启发式合并的版题,随便取一个子树的setsetset,然后启发式合并,把小的并到大的那里去,随便算答案就行了。证明一下这样做的复杂度,每次合并后的数量一定是小的集合大小的两倍,最开始的大小都为111,合并ttt原创 2020-05-29 11:36:57 · 306 阅读 · 0 评论