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);
}