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;
}
本文来自博客园,作者:cwkapn,转载请注明原文链接:https://www.cnblogs.com/cwkapn/p/18970500


浙公网安备 33010602011771号