为啥空间会炸掉啊
查看原帖
为啥空间会炸掉啊
200044
JS_TZ_ZHR楼主2021/5/18 15:04

RT,我寻思我这用到的空间还没有10M啊

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,f,a[N],b[N],tot[N],sum[N];
long long ans;
vector<int>ve[N];
struct Tree {
	int val,ls,rs,dis,f;
} t[N];
int find(int p){
	if(t[p].f!=p)t[p].f=find(t[p].f);
	return t[p].f;
}
int merge(int p1,int p2){
	if(!p1||!p2)return p1+p2;
	if(t[p1].val<t[p2].val||(t[p1].val==t[p2].val&&p1>p2))swap(p1,p2);
	t[p1].rs=merge(t[p1].ls,p2);
	if(t[t[p1].ls].dis<t[t[p1].rs].dis)swap(t[p1].ls,t[p1].rs);
	t[p1].dis=t[t[p1].rs].dis+1;
	return t[p1].f=t[t[p1].ls].f=t[t[p1].rs].f=p1;
}
void pop(int p,int pos){
	tot[pos]-=t[p].val;
	t[p].val=-1;
	t[t[p].ls].f=t[p].ls;
	t[t[p].rs].f=t[p].rs;
	t[p].f=merge(t[p].ls,t[p].rs);
}
void dfs(int now){
    tot[now]=a[now];
    sum[now]=1;
    for(int i=0;i<ve[now].size();i++){
        int y=ve[now][i];
        dfs(y);
        tot[now]+=tot[y];
        sum[now]+=sum[y];
        t[find(now)].f=t[find(y)].f=merge(find(now),find(y));
        while(tot[now]>m)pop(find(now),now),sum[now]--;
    }
    ans=max(ans,(long long)b[now]*sum[now]);
}
signed main() {
	//cout<<sizeof(a)*10/1024/1024;
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>f>>a[i]>>b[i];
		ve[f].push_back(i);
		t[i].f=i,t[i].val=a[i];
	}
	dfs(1);
	cout<<ans<<endl;
}
2021/5/18 15:04
加载中...