codeforces 734E 樹的最大直徑

2021-07-24 16:34:14 字數 1505 閱讀 4286

題意:給出乙個樹,每個節點有一種顏色.每次能夠選中乙個節點,其他的點如果到它的路徑上都是這種顏色那麼可以一起改變顏色.問最少需要改變幾次顏色.

先按照顏色縮點, 然後答案就是縮點之後樹的最大直徑, 直接dp即可.

#include 

#include

#include

#include

#include

#include

#include

#define clear(x,y) memset (x,y,sizeof(x))

#define for(a,b,c) for (int a = b; a <= c; a++)

#define rep(a,b,c) for (int a = b; a >= c; a--)

#define fi first

#define se second

#define pii pair

#define pli pair

#define pb push_back

#define mod 1000000007

template

inline

bool scan (t &ret)

using

namespace

std;

#define maxn 200005

#define maxm maxn*2

int n;

struct node edge[maxm];

int head[maxn], cnt, belong[maxn];

pii e[maxn];

int bcc;

void add_edge (int u, int v)

int a[maxn];

bool vis[maxn];

void dfs (int u)

}vector

g[maxn];

int in[maxn], dp[maxn][2];

void dfs (int u, int father)

else

if (dp[v][0]+1 > dp[u][1])

}}int main ()

clear (vis, 0);

bcc = 0;

for (int i = 1; i <= n; i++) if (!vis[i])

if (bcc == 1)

clear (in, 0);

for (int i = 1; i <= n; i++) g[i].clear ();

for (int i = 1; i < n; i++)

}dfs (1, 0);

int ans = 0;

for (int i = 1; i <= bcc; i++)

printf ("%d\n", (ans+1)/2);

return

0;}

codeforces 173E 組隊 線段樹 離線

bsny所在的精靈社群有n個居民,每個居民有一定的地位和年齡,ri表示第i個人的地位,ai表示第i個人的年齡。最近社群裡要舉行活動,要求幾個人分成乙個小組,小組中必須要有乙個隊長,要成為隊長有這樣的條件 1 隊長在小組中的地位應該是最高的 可以並列第一 2 小組中其他成員的年齡和隊長的年齡差距不能超...

Codeforces 588E 樹上主席樹 Lca

codeforces 588e duff in the army 西安邀請賽網路賽j的公升級版本,要求輸出具體的方案,這題就沒辦法離線水過去了。對dfs序建乙個主席樹,那麼對於每個詢問答案就是 sum u sum v sum lca u,v sum fa lca u,v 之後就不難了,實現起來比較複...

Codeforces 976E 題解報告

1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...