Submission #991898

#TimeUsernameProblemLanguageResultExecution timeMemory
991898huutuanFriend (IOI14_friend)C++14
19 / 100
52 ms8540 KiB
#include "friend.h"

#include <bits/stdc++.h>

using namespace std;

namespace sub1{
   bool adj[30][30];
   bool check(int n,int confidence[],int host[],int protocol[]){
      return n<=20;
   }
   int solve(int n,int confidence[],int host[],int protocol[]){
      for (int i=1; i<n; ++i){
         if (protocol[i]==0){
            adj[i][host[i]]=1;
            adj[host[i]][i]=1;
         }else if (protocol[i]==1){
            for (int j=0; j<i; ++j) if (adj[host[i]][j]){
               adj[i][j]=1;
               adj[j][i]=1;
            }
         }else{
            for (int j=0; j<i; ++j) if (adj[host[i]][j] || j==host[i]){
               adj[i][j]=1;
               adj[j][i]=1;
            }
         }
      }
      int ans=0;
      for (int i=0; i<(1<<n); ++i){
         int cur=0;
         bool check=1;
         for (int j=0; j<n; ++j) if (i>>j&1){
            cur+=confidence[j];
            for (int k=j+1; k<n; ++k) if (i>>k&1){
               check&=!adj[j][k];
            }
         }
         if (check) ans=max(ans, cur);
      }
      return ans;
   }
}

namespace sub2{
   bool check(int n,int confidence[],int host[],int protocol[]){
      return *min_element(protocol+1, protocol+n)==1 && *max_element(protocol+1, protocol+n)==1;
   }
   int solve(int n,int confidence[],int host[],int protocol[]){
      return accumulate(confidence, confidence+n, 0);
   }
}

namespace sub3{
   bool check(int n,int confidence[],int host[],int protocol[]){
      return *min_element(protocol+1, protocol+n)==2 && *max_element(protocol+1, protocol+n)==2;
   }
   struct DSU{
      vector<int> lab, val;
      void init(int n, int confidence[]){
         lab.assign(n, -1);
         vector<int>(confidence, confidence+n).swap(val);
      }
      int find_set(int u){
         return lab[u]<0?u:lab[u]=find_set(lab[u]);
      }
      void union_sets(int u, int v){
         u=find_set(u); v=find_set(v);
         if (u!=v){
            if (lab[u]>lab[v]) swap(u, v);
            lab[u]+=lab[v];
            lab[v]=u;
            val[u]=max(val[u], val[v]);
            val[v]=0;
         }
      }
   } dsu;
   int solve(int n,int confidence[],int host[],int protocol[]){
      dsu.init(n, confidence);
      for (int i=1; i<n; ++i) dsu.union_sets(i, host[i]);
      return accumulate(dsu.val.begin(), dsu.val.end(), 0);
   }
}

namespace sub4{
   bool check(int n,int confidence[],int host[],int protocol[]){
      return *min_element(protocol+1, protocol+n)==0 && *max_element(protocol+1, protocol+n)==0;
   }
   const int N=1e3;
   vector<int> g[N];
   int f[N][2];
   int *a;
   void dfs(int u){
      f[u][0]=0; f[u][1]=a[u];
      for (int v:g[u]) dfs(v), f[u][0]+=max(f[v][0], f[v][1]), f[u][1]+=f[v][0];
   }
   int solve(int n,int confidence[],int host[],int protocol[]){
      for (int i=1; i<n; ++i) g[host[i]].push_back(i);
      a=confidence;
      dfs(0);
      return max(f[0][0], f[0][1]);
   }
}

namespace sub5{
   const int N=1e5+10;
   vector<int> g[N];
   int f[N][2][2], ff[N][2][2];
   int *a, *par, *w;
   void dfs(int u){
      for (int v:g[u]) dfs(v);
      int sz=g[u].size();
      vector<vector<int>> cur(2, vector<int>(2)), nxt(2, vector<int>(2));
      for (int i=0; i<sz; ++i){
         int v=g[u][i];
         if (w[v]==0){
            for (int du=0; du<2; ++du) for (int dp=0; dp<2; ++dp) for (int dv=0; dv<2; ++dv){
               if (du && dv) continue;
               nxt[du][dp]=max(nxt[du][dp], cur[du][dp]+f[v][dv][du]);
            }
         }else if (w[v]==1){
            for (int du=0; du<2; ++du) for (int dp=0; dp<2; ++dp) for (int dv=0; dv<2; ++dv){
               if (dp && dv) continue;
               nxt[du][dp]=max(nxt[du][dp], (!dv)*cur[du][dp]+f[v][dv][du]);
            }
         }else{
            for (int du=0; du<2; ++du) for (int dp=0; dp<2; ++dp) for (int dv=0; dv<2; ++dv){
               if ((du && dv) || (dp && dv)) continue;
               nxt[du][dp]=max(nxt[du][dp], (!dv)*cur[du][dp]+f[v][dv][du]);
            }
         }
         cur.swap(nxt);
         vector<vector<int>>(2, vector<int>(2)).swap(nxt);
      }
      for (int du=0; du<2; ++du) for (int dp=0; dp<2; ++dp){
         f[u][du][dp]=cur[du][dp]+du*a[u];
      }
   }
   int solve(int n,int confidence[],int host[],int protocol[]){
      for (int i=1; i<n; ++i) g[host[i]].push_back(i);
      a=confidence; par=host; w=protocol;
      dfs(0);
      return max(f[0][0][0], f[0][1][0]);
   }
}

// Find out best sample
int findSample(int n,int confidence[],int host[],int protocol[]){
   return sub5::solve(n, confidence, host, protocol);
   // if (sub1::check(n, confidence, host, protocol)) return sub1::solve(n, confidence, host, protocol);
   // if (sub2::check(n, confidence, host, protocol)) return sub2::solve(n, confidence, host, protocol);
   // if (sub3::check(n, confidence, host, protocol)) return sub3::solve(n, confidence, host, protocol);
   // if (sub4::check(n, confidence, host, protocol)) return sub4::solve(n, confidence, host, protocol);
   // return -1;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...