제출 #30971

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

using namespace std;

#define SZ(v) ((int)(v).size())
#define ALL(v) (v).begin(),(v).end()
#define one first
#define two second
typedef long long ll;
typedef pair<double, double> pd;
typedef pair<int, int> pi; typedef pair<ll, int> pli;
typedef pair<ll, ll> pll; typedef pair<ll, pi> plp;
typedef tuple<int, int, int> ti; typedef tuple<ll, int, int> tli;
const int INF = 0x3f2f1f0f;
const ll LINF = 1ll * INF * INF * 2;

const int MAX_N = 1e5 + 100;

int N, Nr[MAX_N], Cnt[3];
vector<int> Ed[MAX_N];
void makeG(int ho[], int pr[]) {
    for(int i=1; i<N; i++) {
        int h = ho[i];
        if(pr[i] >= 1) for(int x : Ed[h]) Ed[x].push_back(i), Ed[i].push_back(x);
        if(pr[i] % 2 == 0) Ed[h].push_back(i), Ed[i].push_back(h);
    }
}
int Dy[MAX_N][2]; bool Vis[MAX_N];
void getDy(int v, int p) {
    Vis[v] = true;
    Dy[v][1] = Nr[v];
    for(int w : Ed[v]) if(w != p) {
        getDy(w, v);
        Dy[v][0] += max(Dy[w][0], Dy[w][1]);
        Dy[v][1] += Dy[w][0];
    }
}

int Color[MAX_N];
void Coloring(int v, int p, int c) {
    Vis[v] = true;
    Color[v] = c;
    for(int w : Ed[v]) if(Vis[w] == false) Coloring(w, v, 1-c);
}

bool bVis[MAX_N]; int Match[MAX_N];
bool findMatch(int v) {
    if(bVis[v]) return false; bVis[v] = true;
    for(int w : Ed[v]) if(Color[w] == 1) if(Match[w] == -1 || findMatch(Match[w])) {
        Match[w] = v;
        return true;
    }
    return false;
}

int sDy[MAX_N][2]; // 0 : use or not use , 1 : not use
int solve(int ho[], int pr[]) {
    for(int i=0; i<N; i++) sDy[i][0] = Nr[i];
    for(int i=N-1; i>=1; i--) {
        int h = ho[i], p = pr[i];
        if(p == 0) {
            sDy[h][0] += sDy[i][1];
            sDy[h][1] += sDy[i][0];
        }else if(p == 1) {
            sDy[h][0] += sDy[i][0];
            sDy[h][1] += sDy[i][1];
        }else if(p == 2) {
            sDy[h][0] = max(sDy[h][0] + sDy[i][1], sDy[h][1] + sDy[i][0]);
            sDy[h][1] += sDy[i][1];
        }
        sDy[h][0] = max(sDy[h][0], sDy[h][1]);
    }
    return sDy[0][0];
}
int findSample(int n_, int nr_[], int ho_[], int pr_[]) {
    N = n_; for(int i=0; i<N; i++) Nr[i] = nr_[i];
    
    for(int i=1; i<N; i++) Cnt[pr_[i]]++;

    if(N <= 10) {
        int d[15][15] = {0, };
        makeG(ho_, pr_);
        for(int v=0; v<N; v++) for(int w : Ed[v]) d[v][w] = 1;
        int ans = 0;
        for(int s=0; s<(1<<N); s++) {
            vector<int> list;
            for(int i=0; i<N; i++) if(s & (1<<i)) list.push_back(i);
            bool isCan = true;
            for(int x : list) for(int y : list) if(d[x][y] == 1) {isCan = false; break;}
            if(isCan) {
                int sum = 0;
                for(int x : list) sum += Nr[x];
                ans = max(ans, sum);
            }
        }
        return ans;
    }

    if(Cnt[2] == N-1) {
        int maxV = -1;
        for(int i=0; i<N; i++) maxV = max(maxV, Nr[i]);
        return maxV;
    }else if(Cnt[1] == N-1) {
        int sum = 0;
        for(int i=0; i<N; i++) sum += Nr[i];
        return sum;
    }else if(Cnt[0] == N-1) {
        makeG(ho_, pr_);
        int sum = 0;
        for(int i=0; i<N; i++) if(Vis[i] == false) {
            getDy(i, -1);
            sum += max(Dy[i][0], Dy[i][1]);
        }
        return sum;
    }

    bool AllOne = true;
    for(int i=0; i<N; i++) if(Nr[i] != 1) {AllOne = false; break;}
    if(AllOne && (Cnt[1] + Cnt[0]) == N-1) {
        makeG(ho_, pr_);
        for(int i=0; i<N; i++) if(Vis[i] == false) Coloring(i, -1, 0);
        for(int i=0; i<N; i++) Match[i] = -1;

        int flow = 0;
        for(int i=0; i<N; i++) if(Color[i] == 0) {
            for(int j=0; j<N; j++) bVis[j] = false;
            flow += findMatch(i);
        }
        return N - flow;
    }

    
    return solve(ho_, pr_);
}
#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...