2019 (CCPC-Final 2019) K. Russian Dolls on the Christmas(dsu one tree)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 (CCPC-Final 2019) K. Russian Dolls on the Christmas(dsu one tree)相关的知识,希望对你有一定的参考价值。
子树内的问题,每次把子树内的点扔进数组里暴力维护
保留重儿子启发式合并即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6+10;
int t,n;
struct edge{
int to,nxt;
}d[maxn]; int heaed[maxn],cnt=1;
vector<int>vec[maxn];
int dfn[maxn],low[maxn],ID[maxn],id;
int siz[maxn],son[maxn],vis[maxn];
void dfs(int u,int fa)
{
son[u] = 0; siz[u] = 1; dfn[u] = ++id; ID[id] = u;
for( auto v:vec[u] )
{
if( v==fa ) continue;
dfs(v,u);
siz[u] += siz[v];
if( siz[v] > siz[son[u]] ) son[u] = v;
}
low[u] = id;
}
int SON,res,ans[maxn];
void insert(int w,int keep)
{
if( keep==1 )
{
vis[w] = 1;
if( vis[w-1] && vis[w+1] ) res--;
else if( vis[w-1] || vis[w+1] ) return;
else res++;
}
else
{
vis[w] = 0;
if( vis[w-1] && vis[w+1] ) res++;
else if( vis[w-1] || vis[w+1] ) return;
else res--;
}
}
void calc(int u,int fa,int keep)
{
insert( u,keep );
for(auto v:vec[u] )
{
if( v==SON || v==fa ) continue;
for(int j=dfn[v];j<=low[v];j++) insert( ID[j],keep);
}
}
void dsu(int u,int fa,int keep)
{
for( auto v:vec[u] )
{
if( v==fa || v==son[u] ) continue;
dsu(v,u,0);
}
if( son[u] ) dsu(son[u],u,1),SON = son[u];
calc( u,fa,1 );
ans[u] = res; SON = 0;
if( !keep ) calc(u,fa,0);
}
int main()
{
int casenum=0; cin >> t;
while( t-- )
{
cin >> n ;
for(int i=1;i<n;i++)
{
int l,r; scanf("%d%d",&l,&r);
vec[l].push_back( r ), vec[r].push_back( l );
}
dfs(1,1);
dsu(1,1,0);
printf("Case #%d: ",++casenum);
for(int i=1;i<=n;i++) printf("%d%c",ans[i],i==n?'\\n':' ');
for(int i=1;i<=n;i++) vec[i].clear();
id = res = 0;
}
}
以上是关于2019 (CCPC-Final 2019) K. Russian Dolls on the Christmas(dsu one tree)的主要内容,如果未能解决你的问题,请参考以下文章