| 比赛 |
省选 2023 Day1 复现 |
评测结果 |
AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE |
| 题目名称 |
人员调度 |
最终得分 |
10 |
| 用户昵称 |
终焉折枝 |
运行时间 |
9.250 s |
| 代码语言 |
C++ |
内存使用 |
3.42 MiB |
| 提交时间 |
2026-03-02 12:58:43 |
显示代码纯文本
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> G[205];
int dp[1 << 16];
int x[2005], v[2005], id[2005], tot = 0;
bool del[2005];
int msk[205], n, m, k;
void dfs(int u){
msk[u] = 1 << (u - 1);
for(int v : G[u]){
dfs(v);
msk[u] |= msk[v];
}
}
int lowbit(int x){
return x & -x;
}
void solve(){
// cout << "hh";
memset(dp, -1, sizeof(dp));
dp[0] = 0;
tot = 0;
for(int i = 1;i <= k;i ++){
if(!del[i]) id[++ tot] = i;
}
sort(id + 1, id + tot + 1, [](int a, int b){
return v[a] > v[b];
});
for(int i = 1;i <= tot;i ++){
int now = id[i];
for(int s = (1 << n) - 1;s >= 0;s --){
// cout << s << '\n';
if(dp[s] == -1) continue;
for(int r = msk[x[now]] & (~s);r;r &= (r - 1)){
// cout << r << '\n';
dp[s | lowbit(r)] = max(dp[s | lowbit(r)], dp[s] + v[now]);
}
}
}
int ans = 0;
for(int i = 0;i <= (1 << n) - 1;i ++){
ans = max(ans, dp[i]);
}
cout << ans << ' ';
}
int main(){
freopen("transfer.in", "r", stdin);
freopen("transfer.out", "w", stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
int sid; cin >> sid;
cin >> n >> k >> m;
for(int i = 2;i <= n;i ++){
int f; cin >> f;
G[f].push_back(i);
}
dfs(1);
for(int i = 1;i <= k;i ++){
cin >> x[i] >> v[i];
}
solve();
for(int i = 1;i <= m;i ++){
int op; cin >> op;
if(op == 1){
int xx, vv; cin >> xx >> vv;
x[++ k] = xx, v[k] = vv;
}
else{
int xx; cin >> xx;
del[xx] = 1;
}
solve();
}
return 0;
}