| 比赛 |
省选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;
}