Submission #1323872

#TimeUsernameProblemLanguageResultExecution timeMemory
1323872dzuizzThe Xana coup (BOI21_xanadu)C++20
0 / 100
42 ms21460 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N=1e5+5,INF=1e18;
int n,p[N],ord[N],_ord;
vector<int> adj[N];
bool f[N];
void dfs_ord(int u){
  for(auto&v:adj[u]) if(v!=p[u]){
    p[v]=u;
    dfs_ord(v);
  }
  ord[_ord++]=u;
}
signed main(){
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  int n; cin>>n;
  for(int i=0;i<n-1;++i){
    int u,v; cin>>u>>v; --u,--v;
    adj[u].emplace_back(v);
    adj[v].emplace_back(u);
  }
  for(int i=0;i<n;++i) cin>>f[i];
  dfs_ord(0);
  int dp[n][2],sa[n]{},sb[n]{};
  vector<int> va[n],vb[n];
  for(int i=0;i<n;++i){
    int u=ord[i];
    sort(va[u].begin(),va[u].end());
    sort(vb[u].begin(),vb[u].end());

    if(va[u].size()){
      // on - no flip
      int onres=INF;
      for(int j=0,run=0;j<(int)vb[u].size();++j){
        run+=vb[u][j]+1;
        if((j&1) == 0) onres=min(onres,sa[u]+run);
      }
      // on - flip
      for(int j=0,run=0;j<(int)va[u].size();++j){
        run+=va[u][j]+1;
        if((j&1) == 1) onres=min(onres,sb[u]+run+1);
      }
      // off - no flip
      int offres=INF;
      for(int j=0,run=0;j<(int)vb[u].size();++j){
        run+=vb[u][j]+1;
        if((j&1) == 1) offres=min(offres,sa[u]+run);
      }
      // off - flip
      for(int j=0,run=0;j<(int)va[u].size();++j){
        run+=va[u][j]+1;
        if((j&1) == 0) offres=min(offres,sb[u]+run+1);
      }

//      cout<<u<<"= "<<onres<<" "<<offres<<'\n';
      dp[u][0]=offres;
      dp[u][1]=onres;
    }else{
      dp[u][0]=0;
      dp[u][1]=1;
    }

    sa[p[u]]+=dp[u][f[u]];
    sb[p[u]]+=dp[u][1-f[u]];
    va[p[u]].emplace_back(dp[u][f[u]]-dp[u][1-f[u]]);
    vb[p[u]].emplace_back(dp[u][1-f[u]]-dp[u][f[u]]);
  }
//  for(int i=0;i<n;++i) cout<<dp[i][0]<<" "; cout<<'\n';
//  for(int i=0;i<n;++i) cout<<dp[i][1]<<" "; cout<<'\n';
//  for(int i=0;i<n;++i) cout<<ord[i]<<" "; cout<<'\n';
//  cout<<"sa\n";
//  for(int i=0;i<n;++i) cout<<sa[i]<<" "; cout<<'\n';
//  for(int i=0;i<n;++i) cout<<sb[i]<<" "; cout<<'\n';
//  for(int i=0;i<n;++i){ cout<<i<<": "; for(auto&x:va[i]) cout<<x<<" "; cout<<'\n'; }
//  for(int i=0;i<n;++i){ cout<<i<<": "; for(auto&x:vb[i]) cout<<x<<" "; cout<<'\n'; }
  if(dp[0][f[0]]>n) cout<<"impossible\n";
  else cout<<dp[0][f[0]]<<'\n';
  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...