求助
查看原帖
求助
621902
yswn楼主2023/6/9 11:32

2e5的测试点,代码在本地跑不出来,但交上能AC

怀疑zx()函数递归爆栈了

跑到25910就不跑了

#include<bits/stdc++.h>
using namespace std;
const int MAX=200010;
const int inf=-214748356;
int n,m,c[MAX],L,R,x,y,z,k,rt,siz[MAX],maxx[MAX],dis[MAX],dep[MAX];
vector<pair<int,int> >g[MAX];
pair<int,int>d[MAX];
bool vis[MAX];
int sum,cnt;
int ans=inf,tot,root,root1;
struct node{
	int ls,rs,sum;
} t[MAX<<2];
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}//
	while(c<='9'&&c>='0'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
} 
void zx(int,int);
void csiz(int,int);
void cdis(int,int);
void dfs(int,int);
void update(int&,int,int,int,int);
int query(int,int,int,int,int);
void merge(int&,int,int,int);
bool cmp(const pair<int,int>&a,const pair<int,int>&b){
	return a.second<b.second;
}
int main(){
	n=read();m=read();L=read();R=read();
	t[0].sum=inf;
	for(int i=1;i<=m;++i)  c[i]=read();
	for(int i=1;i<n;++i){
		x=read();y=read();z=read();
		g[x].push_back(make_pair(y,z));
		g[y].push_back(make_pair(x,z));
	}for(int i=1;i<=n;++i)
		sort(g[i].begin(),g[i].end(),cmp); 
	maxx[rt=0]=MAX;sum=n;
	zx(1,-1);
	csiz(rt,-1);dfs(rt,-1);
	printf("%d",ans);
}
void zx(int u,int fa){
	siz[u]=1;maxx[u]=0;
	for(int i=0;i<g[u].size();++i){
		int v=g[u][i].first;
		if(v!=fa&&!vis[v]){
			zx(v,u);siz[u]+=siz[v];
			maxx[u]=max(maxx[u],siz[v]);
		}
	}maxx[u]=max(maxx[u],sum-siz[u]);
	if(maxx[u]<maxx[rt])  rt=u;
}void csiz(int u,int fa){
	siz[u]=1;
	for(int i=0;i<g[u].size();++i){
		int v=g[u][i].first;
		if(v!=fa&&!vis[v]){
			csiz(v,u);siz[u]+=siz[v];
		}
	}
}void cdis(int u,int fa,int lc){
	if(dep[u]>R)  return;
	d[++cnt]=make_pair(dis[u],dep[u]);
	for(int i=0;i<g[u].size();++i){
		int v=g[u][i].first;
		if(v!=fa&&!vis[v]){
			dis[v]=dis[u];dep[v]=dep[u]+1;
			if(g[u][i].second!=lc)  dis[v]+=c[g[u][i].second];
			cdis(v,u,g[u][i].second);
		}
	}
}
void dfs(int u,int fa){
	vis[u]=1;int las=0;
	for(int i=0;i<g[u].size();++i){
		int v=g[u][i].first;
		if(v!=fa&&!vis[v]){
			dis[v]=c[g[u][i].second];dep[v]=1;
			if(g[u][i].second!=las){
				merge(root,root1,1,n);root1=0;
			}cnt=0;cdis(v,u,g[u][i].second);
			for(int j=1;j<=cnt;++j){
				if(d[j].second>=L&&d[j].second<=R)  ans=max(ans,d[j].first);
				ans=max(ans,query(root,1,n,L-d[j].second,R-d[j].second)+d[j].first);
				ans=max(ans,query(root1,1,n,L-d[j].second,R-d[j].second)+d[j].first-dis[v]);
			}for(int j=1;j<=cnt;++j)  update(root1,1,n,d[j].second,d[j].first);
			las=g[u][i].second;
		}
	}
	while(tot--)  t[tot+1].ls=t[tot+1].rs=0;
	tot=root=root1=0;
	for(int i=0;i<g[u].size();++i){
		int v=g[u][i].first;
		if(v!=fa&&!vis[v]){
			maxx[rt=0]=MAX;sum=siz[v];
			zx(v,u);csiz(rt,-1);dfs(rt,-1);
		}
	}
}
void update(int &pos,int l,int r,int x,int num){
	if(!pos){pos=++tot;t[pos].sum=inf;}
	if(l==r){t[pos].sum=max(t[pos].sum,num);return;}
	int mid=(l+r)>>1;
	if(x<=mid)  update(t[pos].ls,l,mid,x,num);
	else  update(t[pos].rs,mid+1,r,x,num);
	t[pos].sum=max(t[t[pos].ls].sum,t[t[pos].rs].sum);
}int query(int pos,int l,int r,int ll,int rr){
	if(!pos||ll>r||rr<l)  return inf;
	if(ll<=l&&rr>=r)  return t[pos].sum;
	int mid=(l+r)>>1;
	return max(query(t[pos].ls,l,mid,ll,rr),query(t[pos].rs,mid+1,r,ll,rr));
}void merge(int &ra,int rb,int l,int r){
	if(!rb)  return;
	if(!ra){ra=rb;return;} 
	if(l==r){
		t[ra].sum=max(t[ra].sum,t[rb].sum);
		return;
	}int mid=(l+r)>>1;
	merge(t[ra].ls,t[rb].ls,l,mid);
	merge(t[ra].rs,t[rb].rs,mid+1,r);
	t[ra].sum=max(t[t[ra].ls].sum,t[t[ra].rs].sum);
}
2023/6/9 11:32
加载中...