Submission #1184357

#TimeUsernameProblemLanguageResultExecution timeMemory
1184357pensiveFriend (IOI14_friend)C++20
46 / 100
221 ms131072 KiB
#include "friend.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <algorithm>


using namespace std;
#define ll long long
#define REP(a,i,n) for (int i=a;i<n;i++)
#define f first
#define s second

void iayf(int n, int i, int host, vector<vector<int>> &adjList) {
    adjList[host].push_back(i);
    adjList[i].push_back(host);
}
void mfayf(int n, int i, int host, vector<vector<int>> &adjList) {
    for (auto j : adjList[host]) {
        adjList[j].push_back(i);
        adjList[i].push_back(j);
    }
}
void wayf(int n, int i, int host, vector<vector<int>> &adjList) {
    mfayf(n,i,host,adjList);
    iayf(n, i, host, adjList);
}
int maxSample(int n, int i, vector<vector<int>> &adjList, vector<int> &includes, int confidence[]) {
    if (i==n) {
        return 0;
    }
    int cleared=0;
    for (auto j : adjList[i]) {
        cleared += includes[j];
    }
    int ans= maxSample(n,i+1,adjList,includes,confidence);
    if (cleared==0) {
        includes[i]=1;
        ans = max(ans, confidence[i]+maxSample(n,i+1,adjList,includes,confidence));
        includes[i]=0;
    }
    return ans;
}

int memoing(int node, int parent, vector<vector<int>> &adjList, vector<pair<int,int> > &memo, int confidence[]) {
    if (memo[node].f == -1) {
        memo[node].f =0;
        memo[node].s = confidence[node];

        if (!(adjList[node].size()==1 && parent!=-1)){
            for (auto j : adjList[node]) {
                if (j==parent) continue;
                memo[node].f += memoing(j, node, adjList, memo, confidence);
                memo[node].s += memo[j].f;
            }
        }
    }
    return max(memo[node].f, memo[node].s);
}

int findSample(int n, int confidence[], int host[], int protocol[]) {
    if (n>10 && protocol[1]==1) {
        int sm=0;
        REP(0,i,n) {
            sm += confidence[i];
        }
        return sm;
    }
    vector<vector<int> > adjList(n);
    REP(1,i,n) {
        if (protocol[i]==0) iayf(n,i,host[i],adjList);
        else if (protocol[i]==1) mfayf(n,i,host[i],adjList);
        else if (protocol[i]==2) wayf(n,i,host[i],adjList);
    }
    if (n>10 && protocol[1]==0) {
        vector<pair<int,int> > memo(n,{-1,-1});
        return memoing(0,-1,adjList,memo,confidence);
    }
    vector<int> includes(n, 0);
    return maxSample(n,0,adjList,includes,confidence);
} 
#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...