如题,不知道为什么长剖被卡空了,是否是长剖假了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+114;
const int mod = 1e9+7;
vector< pair<int,int> > E[maxn];
int n,q,maxdep[maxn];
int son[maxn],cost[maxn];
vector<int> dp[maxn],sum[maxn],sz[maxn];//dp[u][i] (u,i) 的答案 sum[u][i] u 的 i-son 到 u 的距离之和 sz[u][i] u 的 i-son 数量
void dfs(int u,int fa){
for(pair<int,int> nxt:E[u]){
int v=nxt.first,w=nxt.second;
if(v!=fa){
dfs(v,u);
maxdep[u]=max(maxdep[u],maxdep[v]+1);
if(maxdep[v]>=maxdep[son[u]]) son[u]=v,cost[u]=w;
}
}
}
//sum[u][i]=sum[u][i]+cost[u]*sz[u][i]
int val(int u,int i){return (1ll*sum[u][i]+1ll*cost[u]*sz[u][i])%mod;}
int answer[maxn];
vector< pair<int,int> >ask[maxn];//(k,id)
void DP(int u,int fa){
if(son[u]!=0){
DP(son[u],u);
swap(dp[son[u]],dp[u]);
swap(sum[son[u]],sum[u]);
swap(sz[son[u]],sz[u]);
cost[u]=(cost[son[u]]+cost[u])%mod;
}
dp[u].push_back(0);
sum[u].push_back((mod-cost[u])%mod);
sz[u].push_back(1);
sz[u].resize(maxdep[u]+1);
dp[u].resize(maxdep[u]+1);
sum[u].resize(maxdep[u]+1);
//cout<<u<<' '<<maxdep[u]+1<<' '<<dp[u].size()<<' '<<son[u]<<'\n';
for(pair<int,int> nxt:E[u]){
int v=nxt.first,w=nxt.second;
if(v!=fa&&v!=son[u]){
DP(v,u);
int c=maxdep[u]-maxdep[v]-1;
for(int i=0;i<=maxdep[v];i++){
dp[u][i+c]=(1ll*dp[u][i+c]+dp[v][i]+1ll*sz[u][i+c]*((1ll*val(v,i)+1ll*sz[v][i]*w%mod)%mod)%mod+1ll*sz[v][i]*val(u,i+c)%mod)%mod;
sz[u][i+c]=sz[u][i+c]+sz[v][i];
sum[u][i+c]=(1ll*sum[u][i+c]+mod-(1ll*cost[u]*sz[v][i]%mod))%mod;
sum[u][i+c]=(1ll*sum[u][i+c]+val(v,i)+1ll*sz[v][i]*w%mod)%mod;
}
dp[v].clear();
sz[v].clear();
sum[v].clear();
}
}
E[u].clear();
for(pair<int,int> query:ask[u]){
if(query.first<=maxdep[u]) answer[query.second]=dp[u][maxdep[u]-query.first];
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
E[u].push_back(make_pair(v,w));
E[v].push_back(make_pair(u,w));
}
for(int i=1;i<=q;i++){
int u,k;
cin>>u>>k;
ask[u].push_back(make_pair(k,i));
}
dfs(1,0);
DP(1,0);
for(int i=1;i<=q;i++) cout<<answer[i]<<'\n';
return 0;
}