![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
那页
这个作者很懒,什么都没留下…
展开
-
CF734E Anton and Tree 树上缩点
传送门 思路 把连通块缩成一个点,然后就可以直接转化成一个相邻点颜色不同的树。那么把这颗树变成同色,只需要(树的直径+1)/2就可以了。 很简单的思路,然年被我实现搞出了无数个问题。总之就是非常离谱 离谱的提交记录。 #include "bits/stdc++.h" #define pii pair<int,int> using namespace std; const int N = 2e5 + 10; int head[N << 1]; int head2[N <<原创 2021-08-16 21:26:25 · 105 阅读 · 0 评论 -
CF14D Two Paths 树的直径
求树上两条不相交路径长度乘积最大值。暴力枚举断边求两个子树直径乘积即可。 #include "bits/stdc++.h" #define pii pair<int,int> using namespace std; const int N = 1e5; int head[N]; int cnt; struct node { int next, to, id; } a[N]; void add(int u, int v, int id) { a[++cnt].to = v;原创 2021-08-16 15:55:53 · 99 阅读 · 0 评论 -
Black and white -2021牛客暑期多校训练营3
经过仔细地观察题目,我们可以发现当我们取矩阵中任意一个点时,我们都会得到这一列和这一行的贡献,故能够想到把每次获得的行列加入一个集合,若集合中包含了所有的行列说明我们一定可以构建出这个矩阵。 下面是克鲁斯卡尔的代码 #include "bits/stdc++.h" //#define int long long using namespace std; const int N = 6e3+10; int fa[N<<1]; struct node{ int x,y,v; } f[N*N原创 2021-07-28 10:38:49 · 92 阅读 · 0 评论 -
The xor-longest Path - 01字典树
挺简单的一个入门题。只要清楚以下几点。 1,一段子串异或和等于两个前缀异或和的异或 2,01字典树的定义 3,会dfs即可 做到以上就没有什么思维难度和代码难度了。 #include "bits/stdc++.h" using namespace std; const int N = 1e5 + 5; int head[N<<1]; long long cnt = 0; int ch[N * 32][2]; int val[N * 32]; struct node { int to,原创 2021-07-20 20:46:54 · 74 阅读 · 0 评论 -
Blood Cousins - 树上启发式合并+倍增
题意: 在一个森林中,如果两个节点a和b向上的第p个祖先相同,就称他们为p代表亲。(跟日常生活中有所不同,p不一定是他们的最近公共祖先)。 给出一些询问,问v的p代表亲的数量。 看起来挺麻烦,但如果我们转化一下题意,就是找一个节点的有几个同深度的子节点。 所以只需要在输入时,把题目给我们的v,p,通过倍增转化成u,dep,这里的dep是相对于u的。 那就是一道裸的dsu on tree 板子了。 // // Created by SANZONG on 2021/7/6. // #include "bits原创 2021-07-09 16:12:45 · 73 阅读 · 0 评论 -
Gym - 102832F Strange Memory -树上启发式合并
计算点对相关的一种dsu on tree做法; 个人总结与普通的区别主要是:在count处变为枚举轻子树累计答案,枚举后加入并继续枚举下一个,最后删除。. 这题还要借助数组来把数字变为01数组以加速异或加法。 bit[num[u]][i][(u>>i)&1] += val;分别为节点值,位数,位为0或1。 #include "bits/stdc++.h" //#define int long long using namespace std; const int maxn = 3e5;原创 2021-07-06 17:06:33 · 113 阅读 · 0 评论 -
CF375D Tree and Queries -树上启发式合并
思路: 因为是对每个子树都进行统计,所以尝试套用dsu on tree。 对于此题,每个询问还带了一个k是变化的。所以对其进行离线。 离线时很容易想到,我们要保留重链上的每种颜色出现几次的信息col[],但如果是这样还不足以求答案。因为要统计几种颜色符合条件还要遍历所有颜色。线段树可能可以优化,但是有另一种方法。再维护另一个数组res[col[i]]用来保存颜色数大于col[i]的数量,因为col[i]是逐渐递增或递减的,所以可以进行维护,不用担心res中间出现空缺。 // // Created by ac原创 2021-07-06 15:38:55 · 93 阅读 · 0 评论 -
CodeForces - 570D Tree Requests (树上启发式合并)
树上启发式合并,题目需要求的是每棵子树独立的一个答案,此时考虑树上启发式合并。 判断是否可以组成回文只需要满足小于等于一个字母出现奇数次。 在做树上启发式合并的时候合并操作需要根据后续提问来标记答案。因为没办法在处理的时候记下所有答案。所以我们需要询问的一个数组。以顶点为集合标识,在里面遍历,找到一个深度就计算是否可行,然后这个顶点下的这个深度的ans就有了,我们给这个答案一个编号以便于后续输出。 // // Created by SANZONG on 2021/7/6. // #include "bit原创 2021-07-06 09:49:31 · 110 阅读 · 0 评论