CF763A Timofey and a tree 题解
分析
乱搞题。
优先考虑 DP。定义状态函数
考虑换根的情况。在以
原来的儿子判定直接像节点
复杂度
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
const int N=2e5+10;
int n,col[N];
int ne[N],e[N],h[N],idx;
int s[N],len;
int where[N],dfsx[N],siz[N],fath[N],cnt;
int f[N];
il void add(int a,int b){ne[++idx]=h[a],e[idx]=b,h[a]=idx;}
il void dfs(int now,int fa){
siz[now]=1,fath[now]=fa,
dfsx[++cnt]=now,where[now]=cnt,
f[now]=1;
for(re int i=h[now];i;i=ne[i]){
int j=e[i];if(j==fa) continue;
dfs(j,now);siz[now]+=siz[j];
if(col[j]!=col[now]) f[now]=0;
f[now]=min(f[now],f[j]);
}
}
il int get(int x){return (x-1)/len+1;}
il int query(int l,int r,int x){
if(l>r) return 1;
int bl=get(l),br=get(r),ans=0;
if(bl==br){
for(re int i=l;i<=r;++i)
if(col[dfsx[i]]!=x) return 0;
return 1;
}
else{
for(re int i=l;i<=bl*len;++i)
if(col[dfsx[i]]!=x) return 0;
for(re int i=bl+1;i<br;++i)
if(s[i]!=len||col[dfsx[i*len]]!=x) return 0;
for(re int i=(br-1)*len+1;i<=r;++i)
if(col[dfsx[i]]!=x) return 0;
return 1;
}
}
il void solve(){
cin>>n;len=sqrt(n);
for(re int i=1,u,v;i<n;++i) cin>>u>>v,add(u,v),add(v,u);
for(re int i=1;i<=n;++i) cin>>col[i];
dfs(1,0);
for(re int i=1;i<=n;++i) s[get(i)]+=((col[dfsx[i]]==col[dfsx[i-1]])||(!s[get(i)]));
for(re int i=1;i<=n;++i)
if(i==1){
bool fl=0;
for(re int j=h[i];j;j=ne[j]) if(!f[e[j]]) fl=1;
if(!fl){cout<<"YES\n"<<i;return;}
}
else{
bool fl=0;
for(re int j=h[i];j;j=ne[j]) if(!f[e[j]]&&e[j]!=fath[i]) fl=1;
if(fl) continue;
if(query(1,where[i]-1,col[1])&&query(where[i]+siz[i]-1+1,n,col[1])){cout<<"YES\n"<<i;return;}
}
cout<<"NO";return;
}
signed main(){
solve();
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性