제출 #1174647

#제출 시각아이디문제언어결과실행 시간메모리
1174647hengliaoBalanced Tree (info1cup18_balancedtree)C++20
10 / 100
4094 ms12872 KiB
#include<bits/stdc++.h> using namespace std; #define F first #define S second #define pb push_back #define vll vector<ll> #define pll pair<ll, ll> typedef long long ll; const ll mxN=5e5+5; const ll inf=1e9; ll n; vll adj[mxN]; ll c[mxN]; ll tep[mxN]; ll dp[mxN]; ll dp2[mxN]; ll tar; ll dumb; void dfs(ll cur, ll par){ dp[cur]=-inf; dp2[cur]=inf; // if(c[cur]==-1){ // dp[cur][0][1][0]=0; // dp[cur][1][1][0]=0; // } // else{ // dp[cur][c[cur]][1][0]=0; // } if(tep[cur]==dumb){ dp2[cur]=0; dp[cur]=0; } for(auto &chd:adj[cur]){ if(chd==par) continue; dfs(chd, cur); ll tep1=inf, tep2=inf; if(dp[cur]+dp2[chd]+1<=tar && dp[chd]+1+dp2[cur]<=tar){ dp[cur]=-inf; } else if(dp[cur]+dp2[chd]+1<=tar){ dp[cur]=dp[chd]+1; } else if(dp[chd]+1+dp2[cur]<=tar){ } else{ dp[cur]=max(dp[cur], dp[chd]+1); } dp2[cur]=min(dp2[cur], dp2[chd]+1); } } bool check(ll tt){ tar=tt; dumb=0; dfs(0, -1); // cout<<"tar: "<<tar<<'\n'; // cout<<"dumb: "<<dumb<<'\n'; // for(ll i=1;i<=n;i++){ // cout<<"i: "<<i<<'\n'; // cout<<dp[i]<<' '<<dp2[i]<<'\n'; // } if(dp[0]>-inf) return false; dumb=1; dfs(0, -1); // cout<<"tar: "<<tar<<'\n'; // cout<<"dumb: "<<dumb<<'\n'; // for(ll i=1;i<=n;i++){ // cout<<"i: "<<i<<'\n'; // cout<<dp[i]<<' '<<dp2[i]<<'\n'; // } if(dp[0]>-inf) return false; return true; } void solve(){ cin>>n; for(ll i=0;i<=n;i++){ adj[i].clear(); } for(ll i=0;i<n-1;i++){ ll u, v; cin>>u>>v; u--; v--; adj[u].pb(v); adj[v].pb(u); } for(ll i=0;i<n;i++){ cin>>c[i]; } ll ans=inf; ll good=-1; for(ll mask=0;mask<(1LL<<n);mask++){ bool ok=1; for(ll i=0;i<n;i++){ if((mask>>i)&1){ if(c[i]==0){ ok=0; break; } tep[i]=1; } else{ if(c[i]==1){ ok=0; break; } tep[i]=0; } } if(!ok) continue; ll lef=1, rig=n-1; ll cur=-1; while(lef<=rig){ ll mid=(lef+rig)/2; if(check(mid)){ cur=mid; rig=mid-1; } else{ lef=mid+1; } } if(cur==-1) continue; if(cur<ans){ ans=cur; good=mask; } } if(ans==inf){ cout<<-1<<'\n'; return; } cout<<ans<<'\n'; for(ll i=0;i<n;i++){ cout<<((good>>i)&1)<<' '; } cout<<'\n'; // check(2); // ll lef=1, rig=n-1; // ll ans=-1; // while(lef<=rig){ // ll mid=(lef+rig)/2; // if(check(mid)){ // ans=mid; // rig=mid-1; // } // else{ // lef=mid+1; // } // } // cout<<ans<<'\n'; // if(ans==-1) return; // for(ll i=1;i<=n;i++){ // if(c[i]==-1 && i==4){ // cout<<1<<' '; // } // else if(c[i]==-1){ // cout<<0<<' '; // } // else{ // cout<<c[i]<<' '; // } // } // cout<<'\n'; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin>>t; while(t--){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...