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