Submission #313690

#TimeUsernameProblemLanguageResultExecution timeMemory
313690amunduzbaevFriend (IOI14_friend)C++14
69 / 100
320 ms65536 KiB
//#include "grader.cpp" #include "friend.h" #include <bits/stdc++.h> using namespace std; #define pb(n) push_back(n) const int N=1e5+5; int dp[N][2], conf[N], used[N], match[N]; vector<vector<int>>v; vector<int>l, r, edges[1005]; void add(int a,int b){ v[a].pb(b); v[b].pb(a); } //if all 0 void dfs(int ei,int prev){ dp[ei][1]=conf[ei]; for(auto x : edges[ei]){ if(x == prev) continue; dfs(x,ei); dp[ei][0] += dp[x][1]; dp[ei][1] += dp[x][0]; } dp[ei][1]=max(dp[ei][0],dp[ei][1]); } //divide into two part left and right and solve with bipartite void bpart(int ei, int col=0){ if(col == 0) l.pb(ei); else r.pb(ei); used[ei] = true; for(auto x : edges[ei]){ if(used[x])continue; bpart(x, col^1); } } //check if matches bool check(int ei, int time){ used[ei]=time; for(auto x : edges[ei]){ if(match[x]==-1 || used[match[x]]!=time && check(match[x], time)) { match[x]=ei; return 1; } }return 0; } //main function int findSample(int n,int c[],int h[],int p[]){ int ans=0; for(int i=0;i<n;i++){ conf[i]=c[i]; } bool e0=1, e1=1, e2=1; for(int i=1;i<n;i++){ e0=(p[i]!=0?0:e0); e1=(p[i]!=1?0:e1); e2=(p[i]!=2?0:e2); } // if n <= 15 if(n<=15){ v.resize(n); for(int i=1;i<n;i++){ if(p[i]==0) add(h[i],i); else{ for(auto x:v[h[i]]) add(x,i); if(p[i]==2) add(h[i],i); } } int mask=1; while(mask < (1<<n)){ int cost=0; vector<int> used1(n,0); for(int i=0;i<n;i++){ if(!((1<<i)&mask)) continue; bool ok=1; for(auto x:v[i]) if(used1[x]) ok=0; if(ok){ cost+=c[i]; used1[i]=1; } } ans=max(ans,cost); mask++; } return ans; } // if all 1 else if(e1){ for(int i=0;i<n;i++) ans += c[i]; } // if all 2 else if(e2){ for(int i=0;i<n;i++) ans = max(ans, c[i]); } // if all 0 else if(e0){ for(int i=1;i<n;i++){ edges[i].pb(h[i]); edges[h[i]].pb(i); } dfs(0, 0); ans = dp[0][1]; } // if 1 and 0 else { for(int i=1;i<n;i++){ if(p[i] == 0){ edges[i].pb(h[i]); edges[h[i]].pb(i); }else { for(auto x : edges[h[i]]){ edges[i].pb(x); edges[x].pb(i); } if(p[i] == 2){ edges[i].pb(h[i]); edges[h[i]].pb(i); } } } for(int i=0;i<n;i++) if(!used[i])bpart(i); int s = 1001, e = 1002; for(auto x : l) edges[s].pb(x); for(auto x : r) edges[x].pb(e); for(int i=0;i<n;i++) match[i] = -1; int timer = 0; for(auto ei : l){ timer++; ans += check(ei, timer); }ans = n-ans; } return ans; } /* 6 13 3 6 20 10 15 0 0 1 1 2 0 0 0 1 1 1 0 */

Compilation message (stderr)

friend.cpp: In function 'bool check(int, int)':
friend.cpp:40:43: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   40 |   if(match[x]==-1 || used[match[x]]!=time && check(match[x], time)) {
      |                      ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...