Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma Ofast
- #pragma loop-opt(on)
- #pragma GCC target("avx,avx2")
- #include<iostream>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #include<functional>
- using namespace std;
- #define ll long long
- #define mnpq priority_queue<int, vector<int>, greater<int>>
- const int N = 1e5 + 1;
- int n, m, b[N], c[N], l[N], sz[N];
- vector<int> adj[N];
- ll ans = 0;
- int getSize(int u, int p){
- sz[u] = 1;
- for(int v: adj[u])
- if(v != p)
- sz[u] += getSize(v, u);
- return sz[u];
- }
- void dfs(int u, int p, mnpq &pq){
- int mxc = -1, mxcsz = 0;
- for(int v: adj[u])
- if(v != p and mxcsz < sz[v])
- mxc = v, mxcsz = sz[v];
- if(mxc != -1) dfs(mxc, u, pq);
- {
- mnpq tmp;
- for(int v: adj[u]){
- if(v == mxc or v == p) continue;
- dfs(v, u, tmp);
- while(!tmp.empty())
- pq.push(tmp.top()), tmp.pop();
- }
- }
- pq.push(c[u]);
- ll cursum = 0, cnt = 0;
- vector<int> tmp;
- while(!pq.empty() and cursum + pq.top() <= m){
- tmp.push_back(pq.top());
- cursum += pq.top();
- pq.pop();
- ++cnt;
- }
- ans = max(ans, (ll)l[u] * cnt);
- for(int i: tmp)
- pq.push(i);
- }
- int main(){
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- cin >> n >> m;
- for(int i = 1; i <= n; ++i){
- cin >> b[i] >> c[i] >> l[i];
- adj[i].push_back(b[i]);
- adj[b[i]].push_back(i);
- }
- getSize(1, 0);
- mnpq jizz;
- dfs(1, 0, jizz);
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement