#include<bits/stdc++.h>
#include "friend.h"
using namespace std;
template<class T>void maximize(T& a, T b){
if(a < b){
a = b;
}
}
int findSample(int n, int confidence[], int host[], int protocol[]){
if(n <= 10){
vector<vector<int>>g(n);
auto add_edge = [&] (int u, int v){
g[u].emplace_back(v);
g[v].emplace_back(u);
};
for(int i = 1; i < n; i++){
if(protocol[i] == 1 || protocol[i] == 2){
for(int& j : g[host[i]]){
add_edge(i, j);
}
}
if(protocol[i] == 0 || protocol[i] == 2){
add_edge(host[i], i);
}
}
int ans = 0;
for(int mask = 1; mask < (1 << n); mask++){
bool flag = true;
for(int i = 0; i < n && flag; i++){
if(1 << i & mask){
for(int& j : g[i]){
if(1 << j & mask){
flag = false;
break;
}
}
}
}
if(flag){
int sum = 0;
for(int i = 0; i < n; i++){
if(1 << i & mask){
sum += confidence[i];
}
}
maximize(ans, sum);
}
}
return ans;
}
if(*min_element(protocol + 1, protocol + n) == 1 && *max_element(protocol + 1, protocol + n) == 1){
return accumulate(confidence, confidence + n, 0);
}
if(*max_element(protocol + 1, protocol + n) == 0){
vector<vector<int>>g(n);
for(int i = 1; i < n; i++){
g[host[i]].emplace_back(i);
}
vector<vector<int>>f(n, vector<int>(2, 0));
function<void(int)>dfs;
dfs = [&] (int s){
for(int& d : g[s]){
dfs(d);
f[s][0] += max(f[d][0], f[d][1]);
f[s][1] += f[d][0];
}
f[s][1] += confidence[s];
};
dfs(0);
return max(f[0][0], f[0][1]);
}
if(*min_element(protocol + 1, protocol + n) == 2){
return *max_element(confidence, confidence + n);
}
vector<int>p(n), q(n, 0);
for(int i = 0; i < n; i++){
p[i] = confidence[i];
}
for(int i = n - 1; i > 0; i--){
if(protocol[i] == 0){
p[host[i]] += q[i];
q[host[i]] += max(p[i], q[i]);
}
else if(protocol[i] == 1){
p[host[i]] = max(p[host[i]] + max(p[i], q[i]), p[i] + q[host[i]]);
q[host[i]] += q[i];
}
else{
p[host[i]] = max(p[host[i]] + q[i], p[i] + q[host[i]]);
q[host[i]] += q[i];
}
}
return max(*max_element(p.begin(), p.end()), *max_element(q.begin(), q.end()));
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |