[CF607D]Power Tree】的更多相关文章

题目大意: 一棵树初始只有一个编号为$1$的权值为$w_1$的根.$q(q\le2\times10^5)$次操作,每次可以给出$v,w(w<10^9)$,新建一个结点作为$v$的子结点,权值为$w$:或者给出$u$,求出$f(u)$.定义$f(u)=|S|\cdot\sum_{d\in S}d$,其中$S$为$w_u$与其所有子结点$v$的$f(v)$构成的可重集合. 思路: 首先将树全部建好,用线段树维护DFS序.每次新加结点相当于将这一结点的权值由$0$变为$w$,用线段树计算加上这个点以后…
沙发~~ 题意简述 给你一棵有根树,定义叶子为度数为1的点. 你可以以$ w_x \(的代价控制\)x\(点.选择控制之后可以给它的子树里的叶子加 上\)t (t \in Z )$. 你要以最小的总代价使得:另一个人在叶子上任意放数,你都可以把它 们都变成0. 最后输出最小的总代价,以及有多少点可能被控制,以及每个可能被控制的点的编号 思路索引 首先,我们可以把所有的叶子节点按照 dfs序 抽象成一个序列 接下来,我们可以很神奇的发现,每一个点就对应着一个区间这不是废话吗 然后,选择某个区间后,…
洛谷 Codeforces 这题怎么一个中文题解都没有,是不是你们都认为太水了-- 思路 显然可以用dfs序把每个节点变成给一个区间的叶子节点加上某个数. 显然把叶子序列差分一下变为\(a_1,a_2,...,a_n,a_{n+1}\)之后\([l,r]\)区间加相当于\(l\)加,\(r+1\)减. 然后这就可以变成一个带权无向图. 为了让它可以搞出任意序列,我们需要使这个图连通,也就是求出最小生成树以及每条边是否可以在最小生成树内. \(kruskal\)搞一搞即可. 为什么这样一定合法呢?…
很有趣的一道题. 首先可以对每个叶子进行编号.按照DFS到的顺序即可.(假设从 $1$ 到 $k$) 然后对每个点求出它管辖的所有叶子的编号.因为是DFS序所以这一定是个区间.设点 $u$ 的这个区间是 $[l_u,r_u]$. 区间加操作,考虑差分,那么每个点的操作就变成了 $l_u$ 加一个数,$r_u+1$ 减一个数.(此时也要考虑 $k+1$) 那么题目要求就变成了所有数都变成 $0$. 感受一下,把 $(l_u,r_u+1,c_u)$ 看做一条带权边,那么当且仅当选择的边构成连通图时满…
A.Chain Reaction(DP+二分) 题意:一排有n个灯塔,每个灯塔给出坐标xi和力量yi,每次从最右边依次点亮灯塔,每点亮一个灯塔,它左边的距离它yi范围内的灯塔将受到损坏.现在允许在最右边>max(xi)处添加一座力量值yi的灯塔.问最少只会损坏多少灯塔. 分析:因为我们是从右边点亮灯塔的,所以我们点亮我们添加的那座灯塔只会损坏连续个灯塔.最后就相当于从末尾的某一个灯塔开始点亮.我们令dp[i]表示点亮第i座灯塔最少损坏多少灯塔.于是我们对于每个dp[i],二分可以得到他前面的前驱…
收录了最近本人完成的一部分codeforces习题,不定期更新 codeforces 1132E Knapsack 注意到如果只使用某一种物品,那么这八种物品可以达到的最小相同重量为\(840\) 故答案一定可以被写成\(840k+x(k,x\in N_+)\),我们将\(x\)称为"余下的部分" 故而设\(dp[i][j]\)为当前考虑了前\(i\)个物品,它们所占的余下的部分的重量为\(j\)时,最多可以组成多少个\(840\) 对于每个\(i\)预处理出枚举上界暴力转移即可 #i…
Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下的元素从左往右每\(k\)个一组,最后一组可以不满.给定你一个大小为\(|S|\)的可重集,要求你分出的组中至少有一组构成的可重集包含了给定的可重集. 构造一种符合条件的删数方案. \(n,m,k,|S|\le 5*10^5\) 写了\(1h\)才过,感觉身败名裂. 考虑枚举一个右端点\(r\),显…
Codeforces Round #539 (Div. 1) A. Sasha and a Bit of Relax description 给一个序列\(a_i\),求有多少长度为偶数的区间\([l,r]\)满足\([l,mid]\)的异或和等于\([mid+1,r]\)的异或和. solution 等价于询问有多少长度为偶数的区间异或和为\(0\). 只需要两个位置的异或前缀和与下标奇偶性相同即可组成一个合法区间. #include<cstdio> #include<algorith…
中心节点就是树的中心,2遍dfs求到树的直径.而中心一定在直径上,顺着直径找到中心就够了. 然后能够一遍树形DP找到最小值或者二分+推断是否訪问到叶子节点. #include <iostream> #include<vector> #include<cstdio> #include<algorithm> using namespace std; struct node { int next; int power; int length; }t; vector…
题面戳这里 A. Diana and Liana 首先如果s>ks>ks>k一定无解,特判一下.那么我们考虑找恰好满足满足题目中的要求的区间[l,r][l,r][l,r],那么需要要删去的数一定是(l−1)%k+max((r−l+1)−k,0)(l-1)\%k+max((r-l+1)-k,0)(l−1)%k+max((r−l+1)−k,0).前面的表示要把[1,l−1][1,l-1][1,l−1]区间删成kkk的倍数,后面的表示要把这个区间删到kkk长度以内.判断这个值是否不大于能够删的…