題意:20w個點的樹,邊長都為1,每個點可以往距離不超過k<=5的點進行一次跳躍。求所有的f(a,b)的和,f(a,b)是a到b所需的最小跳躍次數,標號a
題解:樹形dp,a
#include using namespace std;
typedef long long int ll;
ll dp[250000][5];
vectorg[250000];
int k;
ll dists[220000],ans,sons[220000];
void dfs(int x,int fa)
sons[x]+=sons[u];
dists[x]+=dists[u];
dists[x]+=dp[u][k-1];
for(int i=0;i>n>>k;ans=0;
for(int i=1;i>a>>b;
g[a].push_back(b);
g[b].push_back(a);
} dfs(1,0);
cout<
codeforces686D(樹的重心)
題意 求出以每個點為子樹的重心。思路 可以利用重心的性質,某乙個點的重心在最大的點那個子樹上,並且在在這個節點到最大子樹的重心之間,重心滿足num x 2 num u x為重心,u為要求重心的節點,num代表這個節點的子樹的節點個數。includeusing namespace std typede...
Codeforces 755D(思維 線段樹)
從x到x k點,其實只要求從x到x k之間的點有多少條線超過x x k這條線就行,一開始直接暴力,就時間超時了,而用線段樹維護就快多了。1 include 2 using namespace std 3 typedef long long ll 4 define n 1000010 5 define...
CodeForces 686D 樹的重心
傳送門 題意 給你n個節點,其中1為根,第二行給你2 n的節點的父親節點編號。然後是q個詢問,求詢問的節點為根的重心的節點編號。思路 利用樹的重心的乙個性質 樹的重心在 根節點 和 根節點的最大子結點的重心 之間。並且2 cnt v cnt u u為根節點,v為重心 include includeu...