250707 学习笔记

前言

不可自矜学黔驴。

Ich hätte gut daran getan, vor Jahren alle höheren Offiziere liquidieren zu lassen, wie Stalin! —— Bruno Ganz

模拟赛

# A B C D
8 83 62 0 13 8
- 03:00:00 06:33:43 11:22:23 99:99:99 99:99:99

A. BOSS 树

拓扑排序,按子树大小贪心。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n, m, ind[N], dep[N]; // 'dep' refers to the size of subtree
vector<int> g[N];
struct node {
	int num;
};
vector<int> ans[N];
int tot = 0;
const bool operator < (const node &x, const node &y) {return dep[x.num] < dep[y.num];}
priority_queue<node> q;
vector<node> v;
void dfs(int u, int fa) {
	dep[u] = 1;
	int mx = dep[u];
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		dfs(v, u);
		dep[u] += dep[v];
	}
}
signed main() {
	freopen("boss.in", "r", stdin);
	freopen("boss.out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 2; i <= n; i++) {
		int f;
		cin >> f;
		g[f].push_back(i);
		ind[i]++;
	}
	dfs(1, 0);
	q.push({1});
	while (!q.empty()) {
		++tot;
		for (int i = 1; i <= m && !q.empty(); i++) {
			node f = q.top();
			q.pop();
			int u = f.num;
			ans[tot].push_back(u);
			for (int j = 0; j < g[u].size(); j++) {
				ind[g[u][j]]--;
				if (ind[g[u][j]] == 0) v.push_back({g[u][j]});
			}
		}
		while (!v.empty()) {
			q.push(v[v.size() - 1]);
			v.pop_back();
		}
	}
	cout << tot << '\n';
	for (int i = 1; i <= tot; i++) {
		cout << ans[i].size() << ' ';
		for (int j = 0; j < ans[i].size(); j++) {
			cout << ans[i][j] << ' ';
		}
		cout << '\n';
	}
	return 0; 
} 

B. 黄金树的召唤

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5;
int n, a[N];
long double p[N];
vector<int> g[N];
long double f[N], ans[N], self[N], son[N];
void dfs(int u) {
	f[u] = p[u];
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		dfs(v);
		f[u] *= (1 - f[v]);
	}
}
void dp(int u) {
	ans[u] = self[u];
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		self[v] = son[u];
		son[v] =  (self[u] + a[u]) * (f[u] / (1 - f[v]))
		        + (    son[u]    ) * (1 - (f[u] / (1 - f[v])));
		dp(v);
	}
}
signed main() {
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 2; i <= n; i++) {
		int pa;
		cin >> pa;
		g[pa].push_back(i);
	}
	for (int i = 1; i <= n; i++) cin >> p[i];
	for (int i = 1; i <= n; i++) cin >> a[i];
	dfs(1);
	dp(1);
	for (int i = 1; i <= n; i++) ans[i] *= f[i];
	long double res = 0;
	for (int i = 1; i <= n; i++) res += max((long double)0, ans[i]);
	printf("%.6Lf\n", res);
	return 0;
}
posted @ 2025-07-09 18:24  cwkapn  阅读(28)  评论(0)    收藏  举报