Submission #1154137

#TimeUsernameProblemLanguageResultExecution timeMemory
1154137brover29Power Plant (JOI20_power)C++20
6 / 100
1596 ms5700 KiB
#include <bits/stdc++.h>
//qwerty47924692
using namespace std;
using ll = long long;
const ll N=2e5+29;
const string br="617283";
#define sz(a)(ll)a.size()
#define f first
#define s second
ll tin[N],tout[N],h[N],timer,a[N],ans,dp[N],pr[20][N];
string s;
vector<ll>g[N];
void dfs(ll v){
    tin[v]=++timer;
    for(ll i=1;i<=19;i++)pr[i][v]=pr[i-1][pr[i-1][v]];
    for(ll to:g[v]){
        if(to==pr[0][v])continue;
        pr[0][to]=v;
        dfs(to);
    }
    tout[v]=timer;

}
bool is_parent(ll x,ll y){
    return (tin[x]<=tin[y]&&tout[y]<=tout[x]);
}
ll get(ll x,ll y){
    for(ll i=19;i>=0;i--){
        if(!is_parent(pr[i][x],y))x=pr[i][x];
    }if(!is_parent(x,y))return pr[0][x];
    return x;
}
ll cnt=0,sub=0;
void calc(ll v,ll pr=0){
    if(sub){
        cout<<v<<' '<<dp[v]<<'\n';
    }
    for(ll to:g[v]){
        if(to==pr)continue;
        calc(to,v);
        dp[v]+=dp[to];
    }
    if(s[v]=='1'&&dp[v]){
        cnt++;
        if(a[v])cnt++;
        if(sub)cout<<v<<'\n';
    }
}
//}ll cnt(ll v,ll u){
//    ll lca=get(v,u);
//    return h[u]+h[v]-2*h[lca]+(s[lca]-'0');
//}
ll n;
void f(ll x,ll sum){

    if(x==n){
       // sub=(sum==4&&a[1]&&a[8]&&a[5]&&a[7]);
        for(ll i=1;i<=n;i++)dp[i]=0;
        for(ll i=1;i<=n;i++){
            if(!a[i])continue;
            for(ll j=i+1;j<=n;j++){
                if(!a[j])continue;
//              if(sub)cout<<j<<' '<<pr[i]<<'\n';
//                if(is_parent(j,i)){
//                    swp=1;
//                    swap(i,j);
//                }
                ll x=get(i,j);
//                if(sum==4){
//                    cout<<x<<' '<<i<<' '<<j<<'\n';
//                }
                if(x==i){
                    dp[pr[0][j]]++;
                    dp[x]--;
                    continue;
                }if(x==j){
                    dp[pr[0][i]]++;
                    dp[x]--;
                    continue;
                }
                dp[pr[0][i]]++;
                if(x!=1)dp[pr[0][x]]--;
            //    if(sub)cout<<i<<' '<<pr[0][x]<<'\n';
                dp[pr[0][j]]++;
                dp[x]--;


                  //  if(sub)cout<<j<<' '<<pr[0][x]<<'\n';

//                if(swp)swap(i,j);
            }
        }
        cnt=0;
        calc(1);
//        if(sum-cnt==4){
//            for(ll i=1;i<=n;i++)cout<<a[i]<<' ';
//            cout<<'\n';
//        }
        ans=max(ans,sum-cnt);
        return;
    }
    x++;
    a[x]=0;
    f(x,sum);
    if(s[x]=='1'){
        a[x]=1;
        f(x,sum+1);
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n;
    for(ll i=1;i<n;i++){
        ll v,u;
        cin>>v>>u;
        g[v].push_back(u);
        g[u].push_back(v);
    }
    cin>>s;
    pr[0][1]=1;
    s=' '+s;
    dfs(1);
//    a[1]=1;
//    a[2]=1;
//    a[5]=1;
    f(0,0);
    cout<<ans;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...