1. 程式人生 > >loj#2330. 「清華集訓 2017」榕樹之心【樹形dp】

loj#2330. 「清華集訓 2017」榕樹之心【樹形dp】

傳送門

解題思路:

先考慮根是否可行,即步數是否能抵消完。
考慮w[x]表示x的子樹內最少的消剩下的點數。

觀察發現,最難消的肯定是size最大的兒子,設為 y ,而且如果 y 能被消完,即others=size[x]1size[y]>=w[y],那麼 w[x] 最多在 size[x]為奇數時剩一個子節點沒被消,否則肯定能消完(除了自己)。
如果y不能被消完,那麼w[x]=w[y]others+1

再考慮每個節點是否合法。
其實思路就比較簡單了,將根到

x的路徑當做新根(根肯定能走到x,且不影響路徑上的子樹),用與上面類似的方法判斷即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll getint()
{
    ll i=0,f=1;char c;
    for(c=getchar();(c!='-')&&(c<'0'||c>'9');c=getchar());
    if(c=='-')c=getchar(),f=-1;
    for(;c>='0'&&c<='9';c=getchar())i=(i<<3
)+(i<<1)+c-'0'; return i*f; } const int N=100005; int W,n; int size[N],dep[N],w[N],mx1[N],mx2[N],dp[N],ans[N]; int tot,first[N],nxt[N<<1],to[N<<1]; void add(int x,int y) { nxt[++tot]=first[x],first[x]=tot,to[tot]=y; } void dfs1(int u,int fa) { size[u]=1,dep[u]=dep[fa]+1,mx1[u]=mx2[u]=0
; for(int e=first[u];e;e=nxt[e]) { int v=to[e];if(v==fa)continue; dfs1(v,u),size[u]+=size[v]; if(size[v]>size[mx1[u]])mx2[u]=mx1[u],mx1[u]=v; else if(size[v]>size[mx2[u]])mx2[u]=v; } if(size[u]-1-size[mx1[u]]>=w[mx1[u]])w[u]=(size[u]-1)%2; else w[u]=w[mx1[u]]-(size[u]-1-size[mx1[u]]); w[u]++; } void dfs2(int u,int fa) { ans[u]=0; if((size[1]-dep[u])%2==0) { int v=dp[u];if(size[v]<size[mx1[u]])v=mx1[u]; if(size[1]-dep[u]-size[v]>=w[v])ans[u]=1; } for(int e=first[u];e;e=nxt[e]) { int v=to[e];if(v==fa)continue; dp[v]=dp[u]; if(v!=mx1[u]&&size[mx1[u]]>size[dp[v]])dp[v]=mx1[u]; else if(size[mx2[u]]>size[dp[v]])dp[v]=mx2[u]; dfs2(v,u); } } void solve() { tot=0;memset(first,0,sizeof(first)); n=getint(); for(int i=1;i<n;i++) { int x=getint(),y=getint(); add(x,y),add(y,x); } dfs1(1,0); dp[1]=0,dfs2(1,0); if(W==3)putchar('0'+ans[1]); else for(int i=1;i<=n;i++)putchar('0'+ans[i]); putchar('\n'); } int main() { //freopen("lx.in","r",stdin); W=getint();for(int T=getint();T;T--)solve(); return 0; }

相關推薦

loj#2330. 清華集訓 2017榕樹樹形dp

傳送門 解題思路: 先考慮根是否可行,即步數是否能抵消完。 考慮w[x]w[x]表示xx的子樹內最少的消剩下的點數。 觀察發現,最難消的肯定是sizesize最大的兒子,設為 yy ,而且如果

LOJ#2330. 清華集訓 2017榕樹 -樹形dp

題解 先考慮根的情況(Subtask3Subtask3)。 根的每個兒子及其構成的子樹之間可以互相抵消。 設rem[i]rem[i]表示以ii為根的子樹最少的不能互相抵消的點數。 那

LOJ2330清華集訓 2017榕樹

【題目連結】 點選開啟連結 【思路要點】 首先,樹是二分圖,只有一側的點可能成為心。 維護每一棵子樹會產生的向下推動的次數可能的最大值

清華集訓2017榕樹

name clear 方向 世界 oid 可行性 pre lin size 「清華集訓2017」榕樹之心 “已經快是嚴冬了,榕樹的葉子還沒落呢……” “榕樹是常綠樹,是看不到明顯的落葉季節的……” “唉……想不到已經七年了呢。榕樹還是當年的榕樹,你卻不是當年的你了……”

清華集訓 2017無限

無限之WA https://www.luogu.org/problemnew/show/P4003 本題如果知道是網路流的話,其實建圖不算特別神奇,但是比較麻煩。 資料範圍過大,插頭dp不能處理,而且是一個網格圖,考慮網路流。 先看是不是二分圖? 每個格子只會和相鄰四個格子發生關係 所以,黑白染色

LOJ2321清華集訓 2017無限

【題目連結】 【思路要點】 先說這道題的正解: 將棋盤看做一張二分圖,每一條邊拆成兩個點,分別屬於二分圖的一邊。 我們需要做一件類似於匹配的事情,同一條邊的兩側或是都沒有管道,或是都有管道。 通過合適的建邊我們能夠用最小費用最大流來解決本題。 時間複雜度

LOJ2321清華集訓 2017無限

無限之環 題目描述 曾經有一款流行的遊戲,叫做InfinityLoopInfinityLoop,先來簡單的介紹一下這個遊戲: 遊戲在一個 n×mn×m的網格狀棋盤上進行,其中有些小方格中會有水管,水管可能在方格某些方向的邊界的中點有介面,所

LOJ#2320. 清華集訓 2017生成樹計數

rac res 然而 除了 加法 wap OS 代碼 reg 題解 我,理解題解,用了一天 我,卡常數,又用了一天 到了最後,我才發現,我有個加法取模,寫的是while(c >= MOD) c -= MOD 我把while改成if,時間,少了 六倍。 六倍。 六倍!!

LOJ2322清華集訓 2017Hello world!

【題目連結】 點選開啟連結 【思路要點】 一個 1

LOJ2328清華集訓 2017避難所

【題目連結】 點選開啟連結 【思路要點】 令 x

LOJ2326清華集訓 2017簡單資料結構

【題目連結】 點選開啟連結 【思路要點】 注意到答案是 O

LOJ2323清華集訓 2017小 Y 和地鐵

【題目連結】 點選開啟連結 【思路要點】 很不錯的腦洞題。 附上官方題解。 時間複雜度 O

LOJ2324清華集訓 2017小 Y 和二叉樹

【題目連結】 點選開啟連結 【思路要點】 答案的第一位一定是編號最小的度數不為 3

LOJ2329清華集訓 2017我的生命已如風中殘燭

【題目連結】 點選開啟連結 【思路要點】 一個直觀的思路是模擬該過程,當路上遇到環的時候通過類似取模的手段加速。 注意到每繞一個環

LOJ2331清華集訓 2017某位歌姬的故事

【題目連結】 點選開啟連結 【思路要點】 注意到若一個位置被兩種音高 a

LOJ2327清華集訓 2017福若格斯

【題目連結】 點選開啟連結 【思路要點】 M

LOJ2325清華集訓 2017小Y和恐怖的奴隸主(期望概率+矩陣快速冪)

LOJ2325「清華集訓 2017」小Y和恐怖的奴隸主 題意: "A fight? Count me in!" 要打架了,算我一個。 "Everyone, get in here!" 所有人,都過來! 小Y是一個喜歡玩遊戲的OIer。一天,她正在

LOJ2320清華集訓 2017生成樹計數

【題目連結】【思路要點】連上\(a_i\)的限制,題目要求的實際上是\(\sum_{T}\prod_{i=1}^{N}a_i^{d_i}*d_i^{M}\sum_{i=1}^{N}d_i^{M}\)。我們知道樹的Prufer序列與樹點的度數密切相關,因此考慮使用Prufer序

UOJ268 [清華集訓2016] 數據交互 動態DP樹鏈剖分線段樹

auto 合並 -s 樹形dp lazy tail clas 記錄 less 題目分析: 不難發現可以用動態DP做。 題目相當於是要我求一條路徑,所有與路徑有交的鏈的代價加入進去,要求代價最大。 我們把鏈的代價分成兩個部分:一部分將代價加入$LCA$之中,用$g$數組保存;

UOJ #36清華集訓2014瑪裡苟斯

這怎麼想得到啊......... UOJ #36 題意:求隨機一個集合的子集的異或和的$k$次方的期望值,保證答案$ \lt 2^{63},1 \leq k \leq 5$ $ Solution:$ 首先考慮$ k=1$的時候怎麼做:如果某位上有$ 1$則有$ \frac{1}{2}$的