RT,我们教练为了方便教学,自己搭了个OJ,但这一题教练造的数据我只能得65pts(其他有好多人A掉了所以数据应该没什么问题),而洛谷数据AC,请求加强数据。
请教各位神犇我的代码哪里有问题。
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;
}