求大佬注意 /bx /bx
#include <bits/stdc++.h>
using namespace std;
//#define filename "xxx"
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)
//#define multi_cases 1
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define upw(i, a, b) for(int i = (a); i <= (b); ++i)
#define dnw(i, a, b) for(int i = (a); i >= (b); --i)
template<class T> bool vmax(T &a, T b) { return b > a ? a = b, true : false; }
template<class T> bool vmin(T &a, T b) { return b < a ? a = b, true : false; }
template<class T> void clear(T &x) { T().swap(x); }
const int N = 52, M = 125002;
#define int long long
int n, X, d;
int m[N];
vector<int> g[N];
int sz[N];
void DFS(int u) {
sz[u] = 1;
for(auto v : g[u]) DFS(v), sz[u] += sz[v], m[u] += m[v];
}
int f[M];
void update(int v, int w) { dnw(j, 125000, v) vmin(f[j], f[j - v] + w); }
void apart(int v, int w) {
int x = min(n, d);
for(int i = 0; 1 << i <= x; ++i) {
update(v * (1 << i), w * (1 << i));
x -= 1 << i;
}
if(x) update(v * x, w * x);
}
int pos[N];
void Traveller() {
cin >> n >> X >> d;
upw(i, 1, n) {
int fa = 0;
cin >> m[i];
if(i != 1) cin >> fa;
g[fa].push_back(i);
}
DFS(1);
memset(f, 127, sizeof(f));
f[0] = 0;
upw(i, 1, n) apart(sz[i], m[i]);
upw(i, 1, n) pos[i] = i;
sort(pos+1, pos+n+1, [&] (int x, int y) { return sz[x] * m[y] > sz[y] * m[x]; });
// upw(i, 1, n) cerr << pos[i] << ' ';
// cerr << '\n';
int ans = 0;
upw(i, 0, 125000) if(f[i] <= X) {
int r = X - f[i], res = i;
upw(j, 1, n) {
int v = sz[pos[j]], w = m[pos[j]];
int c = pos[j] != 1 ? d - min(d, n) : 1e9;
if(c * w <= r) {
r -= c * w;
res += c * v;
}
else {
res += r / w * v;
break;
}
}
vmax(ans, res);
}
cout << ans << '\n';
}
signed main() {
#ifdef filename
FileOperations();
#endif
signed _ = 1;
#ifdef multi_cases
scanf("%d", &_);
#endif
while(_--) Traveller();
return 0;
}
只挂了一个点,submission.