loj#2330. 「清華集訓 2017」榕樹之心【樹形dp】
解題思路:
先考慮根是否可行,即步數是否能抵消完。
考慮表示的子樹內最少的消剩下的點數。
觀察發現,最難消的肯定是最大的兒子,設為 ,而且如果 能被消完,即,那麼 最多在 為奇數時剩一個子節點沒被消,否則肯定能消完(除了自己)。
如果不能被消完,那麼。
再考慮每個節點是否合法。
其實思路就比較簡單了,將根到
#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】「清華集訓 2017」Hello 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}$的