比赛 省选2023Day1复现 评测结果 AAAAAAAAAAAEEEEEEETTTEEEEEEETTTEEEEEEEEEEEEEEEEEEE
题目名称 人员调度 最终得分 22
用户昵称 flyfree 运行时间 35.846 s
代码语言 C++ 内存使用 11.21 MiB
提交时间 2025-12-12 11:02:20
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
// #define LOCAL
#define ll long long
#define db double
#define Ciallo true
#define pir pair <ll,ll>
#define fs first
#define sc second
#define MAXN 3010
inline ll read(){
    ll f = 1, num = 0;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c=='-') f = -1;c = getchar();
    }
    while(c>='0'&&c<='9') num = num * 10 + c - '0', c = getchar();
    return num * f;
}

multiset <int> st[MAXN];
multiset <int> res[MAXN];
vector <int> e[MAXN];
int siz[MAXN],fa[MAXN];

void init(int x, int p){
    fa[x] = p;
    siz[x] = 1;
    for(auto y : e[x]){
        if(y == p)continue;
        init(y, x);
        siz[x] += siz[y];
    }
}


void work(int x){
    res[x] = st[x];
    for(auto y : e[x]){
        work(y);
        for(auto it : res[y]){
            res[x].insert(it);
        }
    }
    while(res[x].size() > siz[x]){
        auto it = res[x].begin();
        res[x].erase(it);
    }
}

int v[MAXN],pos[MAXN];
int n,k,m;
int main(int argc, char* argv[]){
    freopen("transfer.in", "r", stdin);
    freopen("transfer.out", "w", stdout);
    #ifdef FS
        freopen(argv[1], "r", stdin);
        freopen(argv[2], "w", stdout);
    #elif defined(LOCAL)
        freopen("w.in", "r", stdin);
        freopen("w.out", "w", stdout);
    #endif

    int sid = read();
    n = read(),k = read(),m = read();
    for(int i = 2;i <= n; ++i){
        fa[i] = read();
        e[fa[i]].push_back(i);
    }

    for(int i = 1;i <= k; ++i){
        pos[i] = read(),v[i] = read();
        st[pos[i]].insert(v[i]);
    }

    init(1, 0);
    work(1);
    auto write = [&](){
        int ans = 0;
        for(auto y : res[1])ans += y;
        cout << ans << " ";
        return;
    };
    write();

    for(int i = 1;i <= m; ++i){
        int op = read();
        if(op == 1){
            ++ k;
            pos[k] = read(),v[k] = read();
            st[pos[k]].insert(v[k]);
        }else{
            int id = read();
            st[pos[id]].erase(st[pos[id]].find(v[id]));
        }
        work(1);
        write();
    }

    cerr << "Time : " << 1.0 * clock() / CLOCKS_PER_SEC << "s \n";
    return 0;
}