Submission #111956

#TimeUsernameProblemLanguageResultExecution timeMemory
111956luciocfFriend (IOI14_friend)C++14
16 / 100
3 ms384 KiB
#include <bits/stdc++.h> #include "friend.h" using namespace std; const int maxn = 1e3+10; // ------- MATCHING -------- int match[maxn]; bool mark[maxn]; // ------------------------- int c[maxn]; int dp[maxn][2]; bool connected[maxn][maxn]; vector<int> grafo[maxn]; int dfs(int u, int p, bool is) { if (grafo[u].size() == 1 && u != 0) { if (is) return c[u]; return 0; } if (dp[u][is] != -1) return dp[u][is]; int aux = 0; if (is) aux = c[u]; for (auto v: grafo[u]) { if (v == p) continue; if (is) aux += dfs(v, u, 0); else aux += max(dfs(v, u, 0), dfs(v, u, 1)); } return dp[u][is] = aux; } bool dfs_match(int u) { if (mark[u]) return false; mark[u] = true; for (auto v: grafo[u]) { if (match[v] == -1 || dfs_match(match[v])) { match[v] = u; return true; } } return false; } int get_match(int n) { memset(match, -1, sizeof match); int ans = 0; for (int i = 0; i < n; i++) { memset(mark, 0, sizeof mark); if (dfs_match(i)) ans++; } return ans; } int findSample(int n, int confidence[], int host[], int protocol[]) { bool sub5 = 1; for (int i = 0; i < n; i++) { c[i] = confidence[i]; if (c[i] != 1 || (i > 0 && protocol[i] == 2)) sub5 = 0; } if (sub5) { dfs_match(0); return n-get_match(n); } if (n > 10) { if (protocol[1] == 2) { int mx = 0; for (int i = 0; i < n; i++) mx = max(mx, c[i]); return mx; } else if (protocol[1] == 1) { int s = 0; for (int i = 0; i < n; i++) s += c[i]; return s; } else { memset(dp, -1, sizeof dp); for (int i = 1; i < n; i++) grafo[i].push_back(host[i]), grafo[host[i]].push_back(i); return max(dfs(0, -1, 0), dfs(0, -1, 1)); } } for (int i = 1; i < n; i++) { int h = host[i]; if (protocol[i] == 0) { connected[i][h] = connected[h][i] = 1; } else if (protocol[i] == 1) { for (int j = 0; j < n; j++) if (connected[h][j]) connected[i][j] = connected[j][i] = 1; } else { for (int j = 0; j < n; j++) if (connected[h][j]) connected[i][j] = connected[j][i] = 1; connected[i][h] = connected[h][i] = 1; } } int ans = 0; for (int mask = 0; mask < (1<<n); mask++) { bool ok = 1; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (connected[i][j] && mask&(1<<i) && mask&(1<<j)) ok = 0; if (ok) { int aux = 0; for (int i = 0; i < n; i++) if (mask&(1<<i)) aux += c[i]; ans = max(ans, aux); } } return ans; }
#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...