Submission #1362944

#TimeUsernameProblemLanguageResultExecution timeMemory
1362944ivazivaPower Plant (JOI20_power)C++20
6 / 100
109 ms580 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 200001
#define int long long

int n;vector<int> adj[MAXN];
int dist[MAXN],parent[MAXN];
vector<int> switches;
set<int> on,breakovani;

void dfs(int node,int pret,int depth)
{
    parent[node]=pret;dist[node]=depth;
    for (int sled:adj[node])
    {
        if (sled!=pret) dfs(sled,node,depth+1);
    }
}

int32_t main()
{
   cin>>n;for (int i=1;i<n;i++) {int u,v;cin>>u>>v;adj[u].push_back(v);adj[v].push_back(u);}
   dfs(1,0,0);string s;cin>>s;
   for (int node=1;node<=n;node++)
   {
       if (s[node-1]=='1') switches.push_back(node);
   }
   if (n<=16)
   {
       int answer=-INT_MAX;
       for (int maska=0;maska<(1<<((int)switches.size()));maska++)
       {
           vector<int> vec;
           for (int bit=0;bit<(int)switches.size();bit++)
           {
               if (maska&(1<<bit)) {vec.push_back(switches[bit]);on.insert(switches[bit]);}
           }
           for (int pos1=0;pos1<(int)vec.size();pos1++)
           {
               for (int pos2=pos1+1;pos2<(int)vec.size();pos2++)
               {
                   if (on.find(vec[pos1])==on.end() or on.find(vec[pos2])==on.end()) continue;
                   int curr1=vec[pos1],curr2=vec[pos2];
                   while (dist[curr1]>dist[curr2])
                   {
                       if (binary_search(switches.begin(),switches.end(),curr1) and (curr1!=vec[pos1] and curr1!=vec[pos2]))
                       {
                           breakovani.insert(curr1);
                           if (on.find(curr1)!=on.end()) on.erase(curr1);
                       }
                       curr1=parent[curr1];
                   }
                   while (dist[curr2]>dist[curr1])
                   {
                       if (binary_search(switches.begin(),switches.end(),curr2) and (curr2!=vec[pos1] and curr2!=vec[pos2]))
                       {
                           breakovani.insert(curr2);
                           if (on.find(curr2)!=on.end()) on.erase(curr2);
                        }
                       curr2=parent[curr2];
                   }
                   while (curr1!=curr2)
                   {
                       if (binary_search(switches.begin(),switches.end(),curr1) and (curr1!=vec[pos1] and curr1!=vec[pos2]))
                       {
                           breakovani.insert(curr1);
                           if (on.find(curr1)!=on.end()) on.erase(curr1);
                       }
                       if (binary_search(switches.begin(),switches.end(),curr2) and (curr2!=vec[pos1] and curr2!=vec[pos2]))
                       {
                           breakovani.insert(curr2);
                           if (on.find(curr2)!=on.end()) on.erase(curr2);
                       }
                       curr1=parent[curr1];curr2=parent[curr2];
                   }
                   if (binary_search(switches.begin(),switches.end(),curr1) and (curr1!=vec[pos1] and curr1!=vec[pos2]))
                   {
                       breakovani.insert(curr1);
                       if (on.find(curr1)!=on.end()) on.erase(curr1);
                   }
               }
           }
           answer=max(answer,(int)on.size()-(int)breakovani.size());
           on.clear();breakovani.clear();
       }
       cout<<answer<<endl;return 0;
   }
   return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...