Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37703 LYLAKIOI 【BJ】T3 C++ 运行超时 50 5000 MS 22852 KB 2402 2025-05-02 13:32:23

Tests(7/14):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=4e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m; vector<pi>E[maxn]; ll mx1[maxn],mx2[maxn]; ll ans; int dfn[maxn],siz[maxn],cnt; void dfs(int u,int fa){ mx1[u]=0,mx2[u]=0; for(auto it:E[u]){ int x=it.p1,w=it.p2; if(x!=fa){ dfs(x,u); mx1[x]+=w; if(mx1[x]>mx1[u])mx2[u]=mx1[u],mx1[u]=mx1[x]; else mx2[u]=max(mx2[u],mx1[x]); } } ans=max(ans,mx1[u]+mx2[u]); } ll d[2][maxn]; int idfn[maxn]; void dfs3(int u,int fa){ idfn[dfn[u]=++cnt]=u,siz[u]=1; for(auto it:E[u]){ int x=it.p1; if(x!=fa)dfs3(x,u), siz[u]+=siz[x]; } } ll MX[maxn]; void dfs2(int u,int fa,int op){ for(auto it:E[u]){ int x=it.p1,w=it.p2; if(x!=fa)d[op][x]=d[op][u]+w,dfs2(x,u,op); } } void dfs4(int u,int fa){ MX[u]=d[1][u]; for(auto it:E[u]){ int x=it.p1,w=it.p2; if(x!=fa)dfs4(x,u),MX[u]=max(MX[u],MX[x]); } } bool in(int u,int v){return dfn[v]>=dfn[u]&&dfn[v]<=dfn[u]+siz[u]-1;} ll mxl[maxn],mxr[maxn]; ll ask(int u,int v,ll w){ cnt=0;dfs3(u,0); d[0][u]=0;dfs2(u,0,0); d[1][v]=0;dfs2(v,0,1); dfs4(u,0); ll res=ans; mxl[0]=-1e18,mxr[n+1]=-1e18; up(i,1,n)mxl[i]=max(mxl[i-1],d[0][idfn[i]]); down(i,n,1)mxr[i]=max(mxr[i+1],d[0][idfn[i]]); up(i,1,n)if(in(i,v)){ res=max(res,MX[i]+max(mxl[dfn[i]-1],mxr[dfn[i]+siz[i]])+w); } return res; } void slv(){ n=read();int q=read(); up(i,1,n)E[i].clear(); up(i,1,n-1){ int x=read(),y=read(),w=read(); E[x].p_b(m_p(y,w)),E[y].p_b(m_p(x,w)); }ans=0,dfs(1,0); while(q--){ int u=read(),v=read();ll w=read(); printf("%lld\n",ask(u,v,w)); } } int main(){ //freopen("c.in","r",stdin),freopen("c.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin),fclose(stdout); return 0; }


测评信息: