Submission #1063853

#TimeUsernameProblemLanguageResultExecution timeMemory
1063853kkzyrFriend (IOI14_friend)C++17
27 / 100
24 ms2792 KiB
#include <iostream>
#include <vector>
using namespace std;

bool a[10];

int answer;
vector<int> adj[1000];

void brute_force(int n, int confidence[], int choose, bool used[], int total_sum){
    if (choose == n){
        if (total_sum > answer){
            answer = total_sum;
        }
        return;
    }
    brute_force(n, confidence, choose + 1, used, total_sum);
    bool ok_add = true;
    for (int i = 0;i < adj[choose].size();i++){
        if (used[adj[choose][i]]){
            ok_add = false;
        }
    }
    if (ok_add){
        used[choose] = true;
        brute_force(n, confidence, choose + 1, used, total_sum + confidence[choose]);
        used[choose] = false;
    }
}

int done[1000];
int dp[1000][2];

void do_dp(int node, int confidence[]){
    done[node] = true;
    dp[node][1] = confidence[node];
    cout << node << ' ' << dp[node][1] << '\n';
    for (int i = 0;i < adj[node].size();i++){
        int child = adj[node][i];
        if (!done[child]){
            do_dp(child, confidence);
            dp[node][0] += max(dp[child][0], dp[child][1]);
            dp[node][1] += dp[child][0];
        }
    }
}

int parent[1000];
int ans_taken[1000];

void init(int n){
    for (int i = 0;i < n;i++){
        parent[i] = -1;
    }
}

int find(int x){
    if (parent[x] == -1){
        return x;
    }
    parent[x] = find(parent[x]);
    return parent[x];
}

void merge(int x, int y){
    int component1 = find(x);
    int component2 = find(y);
    if (component1 != component2){
        parent[component1] = component2;
    }
}

int findSample(int n, int confidence[], int host[], int protocol[]){
    if (n <= 10){
        for (int i = 1;i < n;i++){
            if (protocol[i] == 0){
                adj[host[i]].push_back(i);
                adj[i].push_back(host[i]);
            }
            else if (protocol[i] == 1){
                for (int j = 0;j < adj[host[i]].size();j++){
                    int child = adj[host[i]][j];
                    adj[child].push_back(i);
                    adj[i].push_back(child);
                }
            }
            else{
                adj[host[i]].push_back(i);
                adj[i].push_back(host[i]);
                for (int j = 0;j < adj[host[i]].size();j++){
                    int child = adj[host[i]][j];
                    adj[child].push_back(i);
                    adj[i].push_back(child);
                }
            }
        }
        brute_force(n, confidence, 0, a, 0);
        return answer;
    }
    bool all_one_kind = true;
    for (int i = 1;i < n - 1;i++){
        if (protocol[i] != protocol[i + 1]){
            all_one_kind = false;
            break;
        }
    }
    if (all_one_kind and protocol[1] == 0){
        for (int i = 0;i < n;i++){
            adj[host[i]].push_back(i);
            adj[i].push_back(host[i]);
        }
        do_dp(0, confidence);
        return max(dp[0][0], dp[0][1]);
    }
    else if (all_one_kind and protocol[1] == 1){
        int sum = 0;
        for (int i = 0;i < n;i++){
            sum += confidence[i];
        }
        return sum;
    }
    else{
        init(n);
        for (int i = 1;i < n;i++){
            merge(host[i], i);
        }
        for (int i = 0;i < n;i++){
            ans_taken[find(i)] = max(ans_taken[find(i)], confidence[i]);
        }
        int sum = 0;
        for (int i = 0;i < n;i++){
            sum += ans_taken[i];
        }
        return sum;
    }
}

Compilation message (stderr)

friend.cpp: In function 'void brute_force(int, int*, int, bool*, int)':
friend.cpp:19:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for (int i = 0;i < adj[choose].size();i++){
      |                    ~~^~~~~~~~~~~~~~~~~~~~
friend.cpp: In function 'void do_dp(int, int*)':
friend.cpp:38:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |     for (int i = 0;i < adj[node].size();i++){
      |                    ~~^~~~~~~~~~~~~~~~~~
friend.cpp: In function 'int findSample(int, int*, int*, int*)':
friend.cpp:81:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |                 for (int j = 0;j < adj[host[i]].size();j++){
      |                                ~~^~~~~~~~~~~~~~~~~~~~~
friend.cpp:90:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |                 for (int j = 0;j < adj[host[i]].size();j++){
      |                                ~~^~~~~~~~~~~~~~~~~~~~~
#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...