제출 #392880

#제출 시각아이디문제언어결과실행 시간메모리
392880Aldas25친구 (IOI14_friend)C++14
35 / 100
3 ms2764 KiB
#include "friend.h"
#include <bits/stdc++.h>

using namespace std;

#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define REP(n) FOR(O, 1, (n))
#define f first
#define s second
#define pb push_back
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;

const int MAXN = 100100;

int n;
int conf[MAXN], h[MAXN], prot[MAXN];

int sub2 () {
    int ret = 0;
    FOR(i, 0, n-1) ret += conf[i];
    return ret;
}

int sub3 () {
    int ret = 0;
    FOR(i, 0, n-1) ret = max(ret, conf[i]);
    return ret;
}

int dp[MAXN][2];
vi adj[MAXN];

void dfs (int v, int p) {
    dp[v][1] = conf[v];
    for (int u : adj[v]) {
        if (u == p) continue;
        dfs (u, v);
        dp[v][0] += max(dp[u][0], dp[u][1]);
        dp[v][1] += dp[u][0];
    }
}

int sub4 () {
    FOR(i, 1, n-1) adj[h[i]].pb(i);
    dfs (0, -1);
    return max(dp[0][1], dp[0][0]);
}

void addE (int u, int v) {
    adj[u].pb(v);
    adj[v].pb(u);
}

void constructGraph () {
    FOR(i, 0, n-1) adj[i].clear();
    FOR(i, 1, n-1) {
        if (prot[i] == 0) {
            addE(h[i], i);
        } else if (prot[i] == 1) {
            for (int x : adj[h[i]]) {
                addE(x, i);
            }
        } else {
            for (int x : adj[h[i]]) {
                addE(x, i);
            }
            addE(h[i], i);
        }
    }
}

int cnt[2];
bool vis[MAXN];

void bipDfs (int v, bool col = 0) {
    cnt[col]++;
    vis[v] = true;
    for (int u : adj[v])
        if (!vis[u])
            bipDfs(u, !col);
}

int sub5 () {
    constructGraph();
    FOR(i, 0, n-1) vis[i] = false;

    int ret = 0;
    FOR(i, 0, n-1) {
        if (vis[i]) continue;
        FOR(k, 0, 1) cnt[k] =0 ;
        bipDfs(i);
        ret += max(cnt[0], cnt[1]);
    }
    return ret;
}

int findSample(int N,int confidence[],int host[],int protocol[]){
    n = N;
    FOR(i, 0, n-1) conf[i] = confidence[i];
    FOR(i, 1, n-1) h[i] = host[i], prot[i] = protocol[i];

    bool is2 = true;
    bool is3 = true;
    bool is4 = true;
    bool is5 = true;
    FOR(i, 1, n-1) {
        if (protocol[i] != 1) is2 = false;
        if (protocol[i] != 2) is3 = false;
        if (protocol[i] != 0) is4 = false;
        if (protocol[i] == 2) is5 = false;
    }
    FOR(i, 0, n-1) {
        if (conf[i] != 1) is5 = false;
    }

    if (is2)
        return sub2();
    else if (is3)
        return sub3();
    else if (is4)
        return sub4();
    else if (is5)
        return sub5();
    else
        return sub5();
}
#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...