Submission #478279

#TimeUsernameProblemLanguageResultExecution timeMemory
478279Valaki2Friend (IOI14_friend)C++14
46 / 100
27 ms3784 KiB
#include "friend.h"

#include <bits/stdc++.h>
using namespace std;

const int IAmYourFriend = 0;
const int MyFriendsAreYourFriends = 1;
const int WeAreYourFriends = 2;

int solve1(int n, vector<int> values, vector<int> host, vector<int> type) {
    vector<vector<int> > graph(1 + n);
    for(int i = 1; i <= n; i++) {
        if(type[i] == IAmYourFriend) {
            graph[i].push_back(host[i]);
            graph[host[i]].push_back(i);
        }
        if(type[i] == MyFriendsAreYourFriends) {
            for(int nei : graph[host[i]]) {
                graph[i].push_back(nei);
                graph[nei].push_back(i);
            }
        }
        if(type[i] == WeAreYourFriends) {
            for(int nei : graph[host[i]]) {
                graph[i].push_back(nei);
                graph[nei].push_back(i);
            }
            graph[i].push_back(host[i]);
            graph[host[i]].push_back(i);
        }
    }
    int result = 0;
    for(int mask = 0; mask < (1 << (1 + n)); mask++) {
        int cur_result = 0;
        vector<bool> selected(1 + n, false);
        for(int i = 0; i <= n; i++) {
            if(mask & (1 << i)) {
                selected[i] = true;
                cur_result += values[i];
            }
        }
        bool ok = true;
        for(int i = 0; i <= n; i++) {
            if(selected[i]) {
                for(int nei : graph[i]) {
                    if(selected[nei]) {
                        ok = false;
                    }
                }
            }
        }
        if(ok) {
            result = max(result, cur_result);
        }
    }
    return result;
}

int solve2(int n, vector<int> values, vector<int> host, vector<int> type) {
    int result = 0;
    for(int cur : values) {
        result += cur;
    }
    return result;
}

int solve3(int n, vector<int> values, vector<int> host, vector<int> type) {
    int result = 0;
    for(int cur : values) {
        result = max(result, cur);
    }
    return result;
}

vector<vector<int> > graph;
vector<int> parent;
vector<int> dp_chosen;
vector<int> dp_not_chosen;

void dfs(int cur, vector<int> &values) {
    for(int nei : graph[cur]) {
        dfs(nei, values);
        dp_chosen[cur] += dp_not_chosen[nei];
        dp_not_chosen[cur] += max(dp_chosen[nei], dp_not_chosen[nei]);
    }
    dp_chosen[cur] += values[cur];
}

int solve4(int n, vector<int> values, vector<int> host, vector<int> type) {
    graph.resize(1 + n);
    parent.assign(1 + n, 0);
    dp_chosen.assign(1 + n, 0);
    dp_not_chosen.assign(1 + n, 0);
    for(int i = 1; i <= n; i++) {
        graph[host[i]].push_back(i);
        parent[i] = host[i];
    }
    dfs(0, values);
    return max(dp_chosen[0], dp_not_chosen[0]);
}

int findSample(int n,int confidence[],int host[],int protocol[]){
    int _n = n - 1;
    vector<int> _values(1 + _n, 0);
    vector<int> _host(1 + _n, 0);
    vector<int> _type(1 + _n, 0);
    _values[0] = confidence[0];
    vector<int> cnt(3, 0);
    for(int i = 1; i <= _n; i++) {
        _values[i] = confidence[i];
        _host[i] = host[i];
        _type[i] = protocol[i];
        cnt[_type[i]]++;
    }
    if(n <= 10) {
        return solve1(_n, _values, _host, _type);
    } else if(cnt[MyFriendsAreYourFriends] == _n) {
        return solve2(_n, _values, _host, _type);
    } else if(cnt[WeAreYourFriends] == _n) {
        return solve3(_n, _values, _host, _type);
    } else if(cnt[IAmYourFriend] == _n) {
        return solve4(_n, _values, _host, _type);
    }
    return -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...