洛谷数据AC,自造数据65pts求调
查看原帖
洛谷数据AC,自造数据65pts求调
732906
4BboIkm7h楼主2025/1/2 22:02

RT,我们教练为了方便教学,自己搭了个OJ,但这一题教练造的数据我只能得65pts(其他有好多人A掉了所以数据应该没什么问题),而洛谷数据AC请求加强数据

请教各位神犇我的代码哪里有问题。

Code:\text{Code}:

#include<bits/stdc++.h>
#define M N << 7
#define ll long long
#define mid ((pl + pr) >> 1)
using namespace std;
const int N = 1e5 + 10;
ll n, m, master;
ll l[N], c[N], c_[N], rk[N];
ll head[N], tot, size;
ll ans;
struct edge {
	ll next, to;
} e[N];
void add(ll from, ll to) {
	e[++tot].to = to;
	e[tot].next = head[from];
	head[from] = tot;
}
ll read() {
	char c;
	ll x = 0, neg = 1;
	c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-')
			neg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = (x * 10 + c - '0');
		c = getchar();
	}
	return x * neg;
}
struct node {
	ll ls, rs, sum, cost;
} t[M];
ll cnt, root[N];
void pushup(int p) {
	t[p].sum = t[t[p].ls].sum + t[t[p].rs].sum;
	t[p].cost = t[t[p].ls].cost + t[t[p].rs].cost;
}
void update(ll &p, int pl, int pr, int pos, ll k) {
	if (!p) p = ++cnt;
	if (pl == pr) {
		t[p].sum++;
		t[p].cost += k;
		return;
	}
	if (pos <= mid) update(t[p].ls, pl, mid, pos, k);
	else update(t[p].rs, mid + 1, pr, pos, k);
	pushup(p);
}
int merge(ll u, ll v, int pl, int pr) {
	if (!u || !v) return u + v;
	if (pl == pr) {
		t[u].sum += t[v].sum;
		t[u].cost += t[v].cost;
		return u;
	}
	t[u].ls = merge(t[u].ls, t[v].ls, pl, mid);
	t[u].rs = merge(t[u].rs, t[v].rs, mid + 1, pr);
	pushup(u);
	return u;
}
ll query(int p, int pl, int pr, ll limit) {
	if (!p) return 0;
	if (pl == pr) return t[p].cost <= limit ? t[p].sum : 0;
	if (t[t[p].ls].cost >= limit) return query(t[p].ls, pl, mid, limit);
	else return t[t[p].ls].sum + query(t[p].rs, mid + 1, pr, limit - t[t[p].ls].cost);
}
void calc(int u) {
	for (int i = head[u]; i; i = e[i].next) {
		int v = e[i].to;
		calc(v);
		root[u] = merge(root[u], root[v], 1, size);
	}
	ans = max(ans, l[u] * query(root[u], 1, size, m));
}
int main() {
	//freopen("dispatch.in", "r", stdin);
	//freopen("dispatch.out", "w", stdout);
	n = read();
	m = read();
	for (int i = 1; i <= n; i++) {
		ll f = read();
		c[i] = read();
		c_[i] = c[i];
		l[i] = read();
		if (!f) {
			master = i;
			continue;
		}
		add(f, i);
	}
	sort(c_ + 1, c_ + n + 1);
	size = unique(c_ + 1, c_ + n + 1) - 1 - c_;
	for (int i = 1; i <= n; i++) rk[i] = lower_bound(c_ + 1, c_ + size + 1, c[i]) - c_;
	for (int i = 1; i <= n; i++) update(root[i], 1, size, rk[i], c[i]);
	calc(master);
	printf("%lld", ans);
	return 0;
}
2025/1/2 22:02
加载中...