TLE+MLE的63分左偏树求助
查看原帖
TLE+MLE的63分左偏树求助
106738
_Felix楼主2020/7/14 20:37

我深深地怀疑是左偏树模板写炸了,貌似左偏树的模板数据很水?

记录

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100010;
int n,m,cnt;
int dis[N],f[N],ch[N][2],tot[N];
int hd[N],to[N],nxt[N];
void add(int a,int b){
	to[++cnt]=b;
	nxt[cnt]=hd[a];
	hd[a]=cnt;
}
LL val[N],lead[N],sum[N];
int find(int x){
	return x==f[x]?x:f[x]=find(f[x]);
}
int merge(int x,int y){
	if(!x||!y) return x+y;
	if(val[x]<val[y]||(val[x]==val[y]&&x>y)) swap(x,y);
	ch[x][1]=merge(ch[x][1],y);
	if(dis[ch[x][0]]<dis[ch[x][1]]) swap(ch[x][0],ch[x][1]);
	f[ch[x][0]]=f[ch[x][1]]=x;dis[x]=dis[ch[x][1]]+1;
	return x;
}
int del(int x){
	val[x]=-1;f[ch[x][0]]=ch[x][0];f[ch[x][1]]=ch[x][1];
	return f[x]=merge(ch[x][0],ch[x][1]);
}
LL dfs(int u){
	LL ret=0; 
	 for(int i=hd[u];i;i=nxt[i]){
	 	int v=to[i];
	 	ret=max(ret,dfs(v));merge(u,v);
	 	sum[u]+=sum[v];tot[u]+=tot[v];
	 }
	 int k=u;
	 while(sum[u]>m) sum[u]-=val[k],tot[u]--,k=del(k);
	 return max(ret,lead[u]*tot[u]);
}
int main(){
	int rt=1;
	scanf("%d%d",&n,&m);dis[0]=-1;
	for(int i=1,fa;i<=n;i++){
		scanf("%d%lld%lld",&fa,&val[i],&lead[i]);
		add(fa,i);f[i]=i,sum[i]=val[i],tot[i]=1;
		if(fa==0) rt=i;
	}
	printf("%lld\n",dfs(rt));
	return 0;
}
2020/7/14 20:37
加载中...