제출 #115771

#제출 시각아이디문제언어결과실행 시간메모리
115771thecodingwizardFriend (IOI14_friend)C++11
38 / 100
379 ms65536 KiB
#include <bits/stdc++.h> #include "friend.h" using namespace std; #define FOR(a, b, c) for (int a = b; a < c; a++) #define ll long long #define vi vector<int> #define pb push_back #define mp make_pair int memo[1000][2]; set<int> friends[1000]; bool visited[1000]; int *A; void dfsVisited(int u, int p) { visited[u] = true; for (int v : friends[u]) { if (v == p || v == u) continue; dfsVisited(v, u); } } int run(int u, int canTake, int p) { if (memo[u][canTake] != -1) return memo[u][canTake]; int ans = 0; // Option 1: Don't take u int opAns = 0; for (int v : friends[u]) { if (v == p || v == u) continue; opAns += run(v, 1, u); } ans = opAns; // Option 2: Take u if (canTake) { opAns = A[u]; for (int v : friends[u]) { if (v == p || v == u) continue; opAns += run(v, 0, u); } ans = max(ans, opAns); } return memo[u][canTake] = ans; } // Find out best sample int findSample(int n, int confidence[], int host[], int protocol[]) { A = confidence; FOR(i, 1, n) { int h = host[i], p = protocol[i]; if (p == 0) { // IAmYourFriend friends[i].insert(h); friends[h].insert(i); } else if (p == 1) { // MyFriendsAreYourFriends for (int u : friends[h]) { friends[u].insert(i); friends[i].insert(u); } } else { // WeAreYourFriends friends[i].insert(h); friends[h].insert(i); for (int u : friends[h]) { friends[u].insert(i); friends[i].insert(u); } } } if (n <= 10) { // Subtask 1 int ans = 0; for (int i = 0; i < (1 << n); i++) { int curAns = 0; bool invalid = false; for (int j = 0; j < n; j++) { if (!(i & (1 << j))) continue; for (int f : friends[j]) { if (f == j) continue; if (i & (1 << f)) { invalid = true; break; } } if (invalid) break; curAns += confidence[j]; } if (!invalid) ans = max(ans, curAns); } return ans; } else { bool isSubtaskTwo = true; for (int i = 1; i < n; i++) { if (protocol[i] != 1) isSubtaskTwo = false; } if (isSubtaskTwo) { // Subtask two: Sum all confidence values int ans = 0; for (int i = 0; i < n; i++) ans += confidence[i]; return ans; } bool isSubtaskThree = true; for (int i = 1; i < n; i++) { if (protocol[i] != 2) isSubtaskThree = false; } if (isSubtaskThree) { // Subtask Three: We Are Your Friends, entire graph is connected int ans = 0; for (int i = 0; i < n; i++) ans = max(ans, confidence[i]); return ans; } // Subtask Four: Tree // Define dp[i][0] = max confidence of subtree of i, cannot take i // dp[i][1] = max confidence of subtree of i, can take i for (int i = 0; i < n; i++) visited[i] = false; for (int i = 0; i < n; i++) memo[i][0] = memo[i][1] = -1; int ans = 0; for (int i = 0; i < n; i++) { if (!visited[i]) { dfsVisited(i, i); ans += run(i, 1, i); } } return ans; } exit(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...