蒟蒻第三次求助
查看原帖
蒟蒻第三次求助
173660
zhoukangyang楼主2020/7/8 21:33
#include<bits/stdc++.h>
#define N 210000
using namespace std;
int n,m,id[N],size[N],total,fa[N],wht[N],rk;
int ls[N*20],rs[N*20],siz[N*20],tot,had[N];
long long sum[N*20],Ans;
int head[N],last[N];
struct node{
    int to,next;
} e[N];
struct note {
    int id,val,sor;
} a[N];
bool cmpa(note aa,note bb){
    return aa.val<bb.val;
}
bool cmpb(note aa,note bb){
    return aa.id<bb.id;
}
void add_edge(int u,int v,int id) {
    if(head[u] == 0) head[u] = id;
    else e[last[u]].next = id;
    e[id].to = v,last[u] = id;
}
void dfs(int now) {
    ++total,id[now]=total,size[now]=1;
    int u = 1 , v = n , w = had[total-1];
    ++tot , had[total] = rk = tot;
    while(u<v) {
        int mid=(u+v)/2;
        if(a[now].sor<=mid) v=mid,rs[tot]=rs[w],ls[tot]=tot+1,siz[tot]=siz[w]+1,sum[tot]=sum[w]+a[now].val,++tot,w=ls[w];
        else u=mid+1,ls[tot]=ls[w],rs[tot]=tot+1,siz[tot]=siz[w]+1,sum[tot]=sum[w]+a[now].val,++tot,w=rs[w];   
	}
	siz[tot]=1,sum[tot]=a[now].val;
    for(int i = head[now]; i != 0; i= e[i].next)
        dfs(e[i].to) , size[now] += size[e[i].to];
}
void build(int x,int y){
    tot=max(tot,x);
    if(y==1) return;
    ls[x]=x*2,rs[x]=x*2+1;
    build(x*2,(y+1)/2);
    build(x*2+1,y/2);
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++) {
		scanf("%d%d%d",&fa[i],&a[i].val,&wht[i]),a[i].id=i;
		if(fa[i] != 0) add_edge(fa[i],i,i-1);
	}
	sort(a+1,a+n+1,cmpa);
	for(int i = 1; i <= n; i++) a[i].sor=i;
	sort(a+1,a+n+1,cmpb);
	build(1,n),had[0]=1;
	dfs(1);
	for(int i = 1; i <= n; i++) {
		int ans = 0;
   		int K = m , u = 1, v = n , lm = had[id[i]-1] , rm = had[id[i]+size[i]-1];
   		while(u<v) {
			int mid = (u+v)/2;
			if(sum[ls[rm]]-sum[ls[lm]]>(long long)(K)) lm=ls[lm],rm=ls[rm],v=mid;
			else K-=sum[ls[rm]]-sum[ls[lm]],ans+=siz[ls[rm]]-siz[ls[lm]],lm=rs[lm],rm=rs[rm],u=mid+1;
//			cout<<u<<" "<<v<<" "<<ans<<endl;
   		}
   		if(K >= sum[rm]) ans += siz[rm];
		//cout<<wht[i]<<" "<<ans<<endl;
		Ans = max(Ans,(long long)(wht[i])*ans);
	}
	printf("%lld\n",Ans);
    return 0;
}

2020/7/8 21:33
加载中...