Submission #373022

#TimeUsernameProblemLanguageResultExecution timeMemory
373022ijxjdjd친구 (IOI14_friend)C++14
100 / 100
82 ms15776 KiB
#include "friend.h"
#include <bits/stdc++.h>
using namespace std;
// Find out best sample
const int MAXN = (int)(1e5) + 5;
vector<int> bigadj[MAXN];
int curSz = 0;
int inInner[MAXN];
int toInner[MAXN];
int takeDp[MAXN];
int notTakeDp[MAXN];
struct InnerTree {
    vector<int> weight;
    vector<vector<pair<int, int>>> adj;
    InnerTree(int i, int ci) {
        inInner[i] = 0;
        toInner[i] = curSz;
        weight.emplace_back();
        adj.emplace_back();
        weight[0] = ci;
        curSz++;
    }
    void split(int i, int j, int ci, int cj) {
        int cur = inInner[i];
        weight[cur] -= ci;
        adj.emplace_back();
        adj.emplace_back();
        weight.emplace_back();
        weight.emplace_back();
        adj[cur].emplace_back(adj.size()-1, -1);
        weight[adj.size()-1] = ci;
        inInner[i] = adj.size()-1;
        adj[cur].emplace_back(adj.size()-2, -1);
        weight[adj.size()-2] = cj;
        inInner[j] = adj.size()-2;
    }
    void branch(int i, int ci) {
        int cur = inInner[i];
        weight[cur] -= ci;
        adj.emplace_back();
        weight.emplace_back();
        weight[adj.size()-1] = ci;
        adj[cur].emplace_back(adj.size()-1, curSz-1);
        inInner[i] = adj.size()-1;
    }
    void add(int i, int ci, int to) {
        inInner[i] = to;
        weight[to] += ci;
    }
    int getMx(int n) {
        int cur = 0;
        int mcur = 0;
        bool f = false;
        for (auto& e : adj[n]) {
            if (e.second == -1) {
                if (f) {
                    mcur = max(mcur, getMx(e.first));
                    f = false;
                    cur += mcur;
                    mcur = 0;
                }
                else {
                    mcur = max(mcur, getMx(e.first));
                    f = true;
                }
            }
            else {
                cur += max(0, getMx(e.first) - takeDp[e.second] + notTakeDp[e.second]);
            }
        }
        return cur + mcur + weight[n];
    }
    void upd(int n) {
        for (int e : bigadj[n]) {
            notTakeDp[n] += takeDp[e];
        }
        takeDp[n] = getMx(0) + notTakeDp[n];
    }
};
vector<InnerTree> trees;
int findSample(int N,int confidence[],int host[],int protocol[]){
    trees.emplace_back(0, confidence[0]);
    for (int iter = 1; iter < N; iter++) {
        int c = confidence[iter];
        int h = host[iter];
        int p = protocol[iter];
        int ori = toInner[h];
        if (p == 0) {
            trees.emplace_back(iter, c);
            bigadj[ori].push_back(curSz-1);
            trees[ori].branch(h, confidence[h]);
        }
        else if (p == 1) {
            toInner[iter] = ori;
            trees[ori].add(iter, c, inInner[h]);
        }
        else if (p == 2) {
            toInner[iter] = ori;
            trees[ori].split(h, iter, confidence[h], c);
        }
    }
    for (int j = trees.size()-1; j >= 0; j--) {
        trees[j].upd(j);
    }
    return takeDp[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...