Submission #162056

#TimeUsernameProblemLanguageResultExecution timeMemory
162056oolimry친구 (IOI14_friend)C++14
69 / 100
335 ms65540 KiB
#include "friend.h" #include <bits/stdc++.h> using namespace std; vector<int> match, vis; vector<int> AdjList[1004]; int Aug(int l){ if(vis[l]) return 0; vis[l] = 1; for(int j = 0;j < (int) AdjList[l].size();j++){ int r = AdjList[l][j]; if(match[r] == -1 || Aug(match[r])){ match[r] = l; return 1; } } return 0; } int findSample(int n, int confidence[], int host[], int protocol[]) { bool two = true; bool three = true; bool four = true; for(int i = 1;i < n;i++){ if(protocol[i] != 0) four = false; if(protocol[i] != 2) three = false; if(protocol[i] != 1) two = false; } if(four){ vector<int> child[n]; for(int i = 1;i < n;i++){ child[host[i]].push_back(i); } typedef pair<int,int> ii; ii dp[n]; fill(dp,dp+n,ii(0,0)); for(int u = n-1;u >= 0;u--){ dp[u] = ii(confidence[u],0); for(int v : child[u]){ dp[u].first += dp[v].second; dp[u].second += dp[v].first; } dp[u].first = max(dp[u].second,dp[u].first); } return dp[0].first; } else if(three){ long long s = 0; for(int i = 0;i < n;i++){ s = max((long long)confidence[i],s); } return s; } else if(two){ long long s = 0; for(int i = 0;i < n;i++){ s += confidence[i]; } return s; } else if(n <= 10){ vector<int> adj[n]; for(int u = 1;u < n;u++){ if(protocol[u] == 1 || protocol[u] == 2){ //cout << u << "\n"; for(int v : adj[host[u]]){ //cout << v << " "; adj[u].push_back(v); adj[v].push_back(u); } //cout << "\n"; } if(protocol[u] == 0 || protocol[u] == 2){ adj[u].push_back(host[u]); adj[host[u]].push_back(u); } } long long ovans = 0; for(int mask = 0;mask < (1<<n);mask++){ bool can = true; for(int u = 0;u < n;u++){ for(int v : adj[u]){ if((mask & (1<<u)) != 0 && (mask & (1<<v)) != 0){ can = false; break; } } } //cout << mask << " "; if(can){ long long ans = 0; for(int i = 0;i < n;i++){ if((mask & (1<<i)) != 0) ans += confidence[i]; } ovans = max(ovans,ans); } } return ovans; } int colour[n]; colour[0] = 0; vector<int> adj[n]; for(int u = 1;u < n;u++){ if(protocol[u] == 1 || protocol[u] == 2){ for(int v : adj[host[u]]){ adj[u].push_back(v); adj[v].push_back(u); } colour[u] = colour[host[u]]; } if(protocol[u] == 0 || protocol[u] == 2){ adj[u].push_back(host[u]); adj[host[u]].push_back(u); colour[u] = 1 - colour[host[u]]; } } int zeros = 0; //int newNumbers[n]; map<int,int> mm; int cnt = 0; for(int u = 0;u < n;u++){ /* for(int v : adj[u]){ if(v > u) continue; if(colour[u] == 0){ AdjList[u].push_back(v); cout << u << " " << v << "\n"; } else{ AdjList[v].push_back(u); cout << v << " " << u << "\n"; } } */ if(colour[u] == 0){ //newNumbers[u] = cnt; mm[u] = cnt; cnt++; } } zeros = cnt; for(int u = 0;u < n;u++){ if(colour[u] == 1){ //newNumbers[u] = cnt; mm[u] = cnt; cnt++; } } for(int u = 0;u < n;u++){ for(int v : adj[u]){ if(v > u) continue; if(colour[u] == 0){ AdjList[mm[u]].push_back(mm[v]); //cout << u << " " << v << "\n"; } else{ AdjList[mm[v]].push_back(mm[u]); //cout << v << " " << u << "\n"; } } } int MCBM = 0; match.assign(n,-1); for(int l = 0;l < zeros;l++){ vis.assign(zeros,0); MCBM += Aug(l); } return n - MCBM; }
#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...