Submission #253394

#TimeUsernameProblemLanguageResultExecution timeMemory
253394eohomegrownappsFriend (IOI14_friend)C++14
46 / 100
35 ms1528 KiB
#include "friend.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; // Find out best sample vector<vector<int>> adjlist; int subtask1(int n,int confidence[],int host[],int protocol[]){ adjlist.resize(n); for (int i = 1; i<n; i++){ if (protocol[i]==0){ adjlist[host[i]].push_back(i); adjlist[i].push_back(host[i]); } else if (protocol[i]==1){ for (int x : adjlist[host[i]]){ adjlist[i].push_back(x); adjlist[x].push_back(i); } } else { for (int x : adjlist[host[i]]){ adjlist[i].push_back(x); adjlist[x].push_back(i); }; adjlist[host[i]].push_back(i); adjlist[i].push_back(host[i]); } } ll mx = 0; for (int i = 0; i<(1<<n); i++){ //check if ok bool works = true; ll tot = 0; for (int j = 0; j<n; j++){ if ((1<<j)&i){ tot+=confidence[j]; for (int k : adjlist[j]){ if ((1<<k)&i){ works=false; break; } } } if (works==false){ break; } } if (works==false){ continue; } mx=max(mx,tot); } return mx; } int subtask2(int n,int confidence[],int host[],int protocol[]){ int tot = 0; for (int i = 0; i<n; i++){ tot+=confidence[i]; } return tot; } int subtask3(int n,int confidence[],int host[],int protocol[]){ int mx = 0; for (int i = 0; i<n; i++){ mx=max(mx,confidence[i]); } return mx; } vector<vector<int>> dp; int *conf; int f(int node, int par, bool use){ if (dp[node][use]!=-1){ return dp[node][use]; } if (use){ int tot = conf[node]; for (int i : adjlist[node]){ if (i==par){continue;} tot+=f(i,node,false); } return dp[node][use]=tot; } else { int tot = 0; for (int i : adjlist[node]){ if (i==par){continue;} tot+=max(f(i,node,true),f(i,node,false)); } return dp[node][use]=tot; } } int subtask4(int n,int confidence[],int host[],int protocol[]){ adjlist.resize(n); conf = confidence; for (int i = 1; i<n; i++){ adjlist[i].push_back(host[i]); adjlist[host[i]].push_back(i); } dp.resize(n,vector<int>(2,-1)); return max(f(0,-1,false),f(0,-1,true)); } vector<int> lhs; vector<int> dist; vector<int> rmatch; vector<bool> visited; void bfs(int node){ queue<int> q; q.push(node); dist[node]=0; lhs.push_back(node); while (q.size()>0){ int f= q.front(); q.pop(); for (int i : adjlist[f]){ if (dist[i]!=2){continue;} dist[i]=!dist[f]; if (dist[i]==0){ lhs.push_back(i); } q.push(i); } } } bool augmentingPath(int node){ if (visited[node]){ return false; } visited[node]=true; for (int i : adjlist[node]){ if (rmatch[i]==-1||augmentingPath(rmatch[i])){ rmatch[i]=node; return true; } } return false; } int subtask5(int n,int confidence[],int host[],int protocol[]){ adjlist.resize(n); for (int i = 1; i<n; i++){ if (protocol[i]==0){ adjlist[host[i]].push_back(i); adjlist[i].push_back(host[i]); } else if (protocol[i]==1){ for (int x : adjlist[host[i]]){ adjlist[i].push_back(x); adjlist[x].push_back(i); } } else { for (int x : adjlist[host[i]]){ adjlist[i].push_back(x); adjlist[x].push_back(i); }; adjlist[host[i]].push_back(i); adjlist[i].push_back(host[i]); } } dist.resize(n,2); for (int i = 0; i<n; i++){ if (dist[i]!=2){continue;} bfs(i); } int length = 0; rmatch.resize(n,-1); for (int i : lhs){ if (rmatch[i]!=-1){continue;} visited.assign(n,false); length+=augmentingPath(i); } return length; } int subtask6(int n,int confidence[],int host[],int protocol[]){ return 0; } int findSample(int n,int confidence[],int host[],int protocol[]){ if (n<=10){ return subtask1(n,confidence,host,protocol); } else { bool protocols[3]={0,0,0}; for (int i = 1; i<n; i++){ protocols[protocol[i]]=true; } //cout<<protocols[0]<<' '<<protocols[1]<<' '<<protocols[2]<<'\n'; if (protocols[0]==0&&protocols[1]==1&&protocols[2]==0){ return subtask2(n,confidence,host,protocol); } else if (protocols[0]==0&&protocols[1]==0&&protocols[2]==1){ return subtask3(n,confidence,host,protocol); } else if (protocols[0]==1&&protocols[1]==0&&protocols[2]==0){ return subtask4(n,confidence,host,protocol); } else if (protocols[0]==1&&protocols[1]==1&&protocols[2]==0){ return subtask5(n,confidence,host,protocol); } else { return subtask6(n,confidence,host,protocol); } } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...