Submission #313553

#TimeUsernameProblemLanguageResultExecution timeMemory
313553tengiz05Friend (IOI14_friend)C++17
27 / 100
39 ms1912 KiB
#include "friend.h"
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
int dp[1005][2];
int a[200005];
vector<int> edges[1005];
void dfs(int u, int p){
	dp[u][1] = a[u];
	for(auto v : edges[u]){
		if(v == p)continue;
		dfs(v, u);
		dp[u][0] += dp[v][1];
		dp[u][1] = max(dp[u][1], dp[v][0]);
	}
	dp[u][1] = max(dp[u][1], dp[u][0]);
}
int findSample(int n,int confidence[],int host[],int protocol[]){
	int ans=0;
	for(int i=0;i<n;i++)a[i] = confidence[i];
	if(n <= 15){
		int mask = 0;
		vector<int> friends[13];
		for(int i=1;i<n;i++){
			if(protocol[i] == 0){
				friends[i].pb(host[i]);
				friends[host[i]].pb(i);
			}else {
				for(auto x : friends[host[i]]){
					friends[i].pb(x);
					friends[x].pb(i);
				}
				if(protocol[i] == 2){
					friends[i].pb(host[i]);
					friends[host[i]].pb(i);
				}
			}
		}
		mask = 1;
		while(mask < (1<<n)){
			int cost = 0;
			vector<bool> used(n);
			for(int i=0;i<n;i++){
				if(!((1<<i)&mask))continue;
				bool ok = true;
				for(auto x : friends[i])if(used[x])ok=false;
				if(ok)cost += confidence[i], used[i] = true;
			}
			ans = max(cost, ans);
			mask++;
		}
	}else if(protocol[1] == 1){
		for(int i=0;i<n;i++)ans += confidence[i];
	}else if(protocol[1] == 2){
		for(int i=0;i<n;i++)ans = max(ans, confidence[i]);
	}else {
		for(int i=1;i<n;i++){
			edges[i].pb(host[i]);
			edges[host[i]].pb(i);
		}
		dfs(0, 0);
		ans = max(dp[0][0], dp[0][1]);
	}
	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...