Submission #1174650

#TimeUsernameProblemLanguageResultExecution timeMemory
1174650guagua0407Balanced Tree (info1cup18_balancedtree)C++20
13 / 100
325 ms9236 KiB
//#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define f first #define s second #define all(x) x.begin(),x.end() #define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; void setIO(string s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } const int inf=1e9; void solve(){ int n; cin>>n; vector<vector<int>> adj(n+1); for(int i=0;i<n-1;i++){ int a,b; cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } vector<int> c(n+1); for(int i=1;i<=n;i++){ cin>>c[i]; } int l=0,r=n+1; while(l<r){ int D=(l+r)/2; //cout<<D<<'\n'; vector<vector<int>> mn(n+1,vector<int>(2)); vector<vector<int>> cand(n+1,vector<int>(2)); vector<int> d(n+1); function<void(int,int)> dfs=[&](int v,int p){ d[v]=d[p]+1; for(auto u:adj[v]){ if(u==p) continue; dfs(u,v); } mn[v][0]=mn[v][1]=inf; mn[v][c[v]]=d[v]; for(auto u:adj[v]){ if(u==p) continue; for(int t=0;t<2;t++){ if(cand[u][t]!=-1){ if(cand[u][t]+mn[v][t]-2*d[v]<=D) cand[u][t]=-1; } mn[v][t]=min(mn[v][t],mn[u][t]); } } mn[v][0]=mn[v][1]=inf; mn[v][c[v]]=d[v]; reverse(all(adj[v])); for(auto u:adj[v]){ if(u==p) continue; for(int t=0;t<2;t++){ if(cand[u][t]!=-1){ if(cand[u][t]+mn[v][t]-2*d[v]<=D) cand[u][t]=-1; } mn[v][t]=min(mn[v][t],mn[u][t]); } } mn[v][c[v]]=inf; for(auto u:adj[v]){ if(u==p) continue; mn[v][c[v]]=min(mn[v][c[v]],mn[u][c[v]]); } cand[v][0]=cand[v][1]=-1; if(mn[v][c[v]]-d[v]>D) cand[v][c[v]]=d[v]; mn[v][c[v]]=min(mn[v][c[v]],d[v]); for(auto u:adj[v]){ if(u==p) continue; for(int t=0;t<2;t++){ cand[v][t]=max(cand[v][t],cand[u][t]); } } //cout<<v<<' '<<cand[v][0]<<' '<<cand[v][1]<<'\n'; }; dfs(1,0); if(cand[1][0]==-1 and cand[1][1]==-1){ r=D; } else{ l=D+1; } } if(l==n+1){ cout<<-1<<'\n'; } else{ cout<<l<<'\n'; for(int i=1;i<=n;i++){ cout<<c[i]<<' '; } cout<<'\n'; } } int main() {_ int t; cin>>t; while(t--){ solve(); } return 0; } //maybe its multiset not set //yeeorz //diaoborz

Compilation message (stderr)

balancedtree.cpp: In function 'void setIO(std::string)':
balancedtree.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
balancedtree.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...