我是很可爱的萌新,求助0分主席树
查看原帖
我是很可爱的萌新,求助0分主席树
173660
zhoukangyang楼主2020/7/8 11:28

qwq 大佬们帮帮我行吗

#include<bits/stdc++.h>
#define N 120000
using namespace std;
int n,m,id[N],size[N],total,fa[N],wht[N],rk;
int ls[N<<4],rs[N<<4],siz[N<<4],tot,had[N];
long long sum[N<<4],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[rm]-sum[lm]>(long long)(K)) lm=ls[lm],rm=ls[rm],v=mid;
			else K-=sum[rm]-sum[lm],ans+=siz[rm]-siz[lm],lm=rs[lm],rm=rs[rm],u=mid+1; 
			//if(i==3) cout<<"3:"<<u<<" "<<v<<" "<<ans<<endl;
		}
		//cout<<wht[i]<<" "<<ans<<endl;
		Ans = max(Ans,(long long)(wht[i])*ans);
	}
	printf("%lld\n",Ans);
	return 0;
} 
2020/7/8 11:28
加载中...