Submission #582376

#TimeUsernameProblemLanguageResultExecution timeMemory
582376kamelfanger83Friend (IOI14_friend)C++17
46 / 100
31 ms1428 KiB
#include <iostream>
#include <vector>
#include "friend.h"

using namespace std;

pair<int, int> getmax(int i, vector<vector<int>>& children, int* confidence){
    int bo = 0;
    int bm = confidence[i];
    for(int child : children[i]){
        pair<int, int> got = getmax(child, children, confidence);
        bo += got.first;
        bm += got.second;
    }
    bm = max(bm, bo);
    return make_pair(bm, bo);   
}

int findSample(int n, int confidence[], int host[], int protocol[]){
    if(n <= 10){
        vector<vector<bool>> cons (n, vector<bool> (n, false));
        for(int hoster = 1; hoster < n; hoster++){
            if(protocol[hoster] == 0){
                cons[hoster][host[hoster]] = true;
                cons[host[hoster]][hoster] = true;
            }
            else if(protocol[hoster] == 1){
                for(int friender = 0; friender < n; friender++){
                    if(cons[host[hoster]][friender]) cons[friender][hoster] = cons[hoster][friender] = true;
                } 
            }
            else {
                for(int friender = 0; friender < n; friender++){
                    if(cons[host[hoster]][friender]) cons[friender][hoster] = cons[hoster][friender] = true;
                } 
                cons[hoster][host[hoster]] = true;
                cons[host[hoster]][hoster] = true;
            }
        }
        int best = 0;
        for(int bitmask = 0; bitmask < (1 << n); bitmask++){
            int summ = 0;
            for(int i = 0; i < n; i++){
                for(int j = 0; j < n; j++){
                    if(cons[i][j] && ((bitmask & (1 << i)) != 0) && ((bitmask & (1 << j)) != 0)) goto no;
                }
            }
            for(int summer = 0; summer < n; summer++){
                summ += confidence[summer] * ((bitmask & (1 << summer)) != 0);
            }
            best = max(best, summ);
            no:
            ;
        }
        return best;
    }
    if(protocol[1] == 1){
        int summ = 0;
        for(int summer = 0; summer < n; summer++) summ += confidence[summer];
        return summ;
    }
    if(protocol[1] == 2){
        int maxx = 0;
        for(int maxxer = 0; maxxer < n; maxxer++) maxx = max(maxx, confidence[maxxer]);
        return maxx;
    }
    if(protocol[1] == 0){
        vector<vector<int>> children (n);
        for(int hoster = 1; hoster < n; hoster++){
            children[host[hoster]].push_back(hoster);
        }
        return getmax(0, children, confidence).first;
    }
    return 0;
}
#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...