
换根dp
C202044zxy
这个作者很懒,什么都没留下…
展开
-
CF916E Jamie and Tree
一、题目点此看题二、解法建议首先看看这道题,基本上是一道题。现在还剩下的问题就是在换根状态上求lcalcalca,首先这个lcalcalca一定在(u,v)(u,v)(u,v)的路径上,而路径是不会改变的,通过模拟可以发现lcalcalca就是lca(u,v)lca(u,v)lca(u,v),lca(u,lca′)lca(u,lca')lca(u,lca′),lca(v,lca′)lca(v,lca')lca(v,lca′)其中深度最大的。#include <cstdio>#incl原创 2020-06-05 21:11:15 · 231 阅读 · 0 评论 -
CF708C Centroids
一、题目点此看题翻译有点问题,重心应该是每个子树都小于等于n/2n/2n/2的点二、解法点数大于n/2n/2n/2的子树只有一个,枚举每个点的所有子树,找出这个子树内最大的子树,但是要求节点数小于n/2n/2n/2,这样我们就可以把它接在当前点上,然后用siz[v]−siz[v]-siz[v]−这个值判断是否小于n/2n/2n/2设dp[u]dp[u]dp[u]为这个值,可以用换根维护每个点为根的情况,先可以处理出111点为根的状态,由于从uuu换到vvv的时候需要判断dp[u]dp[u]dp[u原创 2020-06-05 12:04:07 · 239 阅读 · 0 评论 -
CF543D Road Improvement
一、题目点此看题二、解法首先有一个dpdpdp,表示走到子树内每个点的方案,如果已经走过了一条不良道路原创 2020-06-05 10:52:03 · 343 阅读 · 0 评论 -
CF1156D 0-1-Tree
一、题目点此看题二、解法假设我们已经确定了(x,y)(x,y)(x,y)中的xxx,那么我们统计其中的yyy就行了,设dp[u][0/1]dp[u][0/1]dp[u][0/1]为不能走0/0/0/可以走000,从uuu到uuu的子树的路径方案总数,转移如下:dp[u][1]=∑(edge=1)?dp[v][0]:dp[v][1]dp[u][1]=\sum (edge=1)?dp[v][0]:dp[v][1]dp[u][1]=∑(edge=1)?dp[v][0]:dp[v][1]dp[u][0]=原创 2020-06-05 09:55:02 · 245 阅读 · 0 评论 -
CF1187E Tree Painting
一、题目点此看题二、解法如果我们确定了第一个染黑的点,那么答案就确定了。把第一个染黑的点当做根,那么算出111的答案后就可以用换根dpdpdp了,设dp[i]dp[i]dp[i]为先染黑iii,染黑完iii子树的答案,转移:dp[u]=siz[u]+∑dp[v]dp[u]=siz[u]+\sum dp[v]dp[u]=siz[u]+∑dp[v]#include <cstdio>#include <iostream>using namespace std;const原创 2020-06-04 21:32:24 · 208 阅读 · 0 评论