参考代码

cookiebus 2024-02-05 11:33:32 8 返回题目

#include <bits/stdc++.h>
#define ld long double
#define int long long
using namespace std;
const int N = 6e5 + 10;
struct Node {
	ld x;
	int id;
	bool operator < (const Node & b) const {
		return x > b.x;
	}
};
vector<int> g[N];
priority_queue<Node> q[N];
int d[N], s[N], cnt[N], h[N], w[N], a[N], v[N], n, m;
int p[N], u[N];
ld mul[N], add[N];
void merge(int u, int v) {
	int x = s[u];
	int y = s[v];
	if (q[x].size() > q[y].size()) swap(x, y);
	while (!q[x].empty()) {
		Node t = q[x].top(); q[x].pop();
		ld val = t.x * mul[x] + add[x];
		val = (val - add[y]) / mul[y];
		q[y].push({val, t.id});
	}
	s[u] = y;
}
void dfs(int u) {
	for (int v : g[u]) {
		d[v] = d[u] + 1;
		dfs(v);
		merge(u, v);
	}
	// t * mul[s[u]] + add[s[u]] < h[u]
	int x = s[u];
	while (!q[x].empty() && q[x].top().x * mul[x] + add[x]
	< h[u]) {
		Node t = q[x].top(); q[x].pop();
		w[t.id] = u;
		cnt[u] ++;
	}
	if (a[u] == 0) add[x] += v[u];
	else mul[x] *= v[u], add[x] *= v[u];
}
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) 
		scanf("%lld", &h[i]);
	for (int i = 2; i <= n; ++i) {
		int f;
		scanf("%lld %lld %lld", &f, &a[i], &v[i]);
		g[f].push_back(i);
	}
	for (int i = 1; i <= n; ++i) {
		s[i] = i;
		mul[i] = 1;
		add[i] = 0;
	}
	for (int i = 1; i <= m; ++i) {
		scanf("%lld %lld", &p[i], &u[i]);
		int x = s[u[i]];
		q[x].push({p[i], i});
	}
	d[1] = 1;
	dfs(1);
	
	for (int i = 1; i <= n; ++i)
		printf("%lld\n", cnt[i]);
	for (int i = 1; i <= m; ++i) {
		printf("%lld\n", d[u[i]] - d[w[i]]);
	}
	return 0;
}
{{ vote && vote.total.up }}