Submission #1165103

#TimeUsernameProblemLanguageResultExecution timeMemory
1165103SmuggingSpunFriend (IOI14_friend)C++20
46 / 100
15 ms1416 KiB
#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);
    }
}

Compilation message (stderr)

friend.cpp: In function 'int findSample(int, int*, int*, int*)':
friend.cpp:75:1: warning: control reaches end of non-void function [-Wreturn-type]
   75 | }
      | ^
#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...