求助空间
查看原帖
求助空间
520748
_Ch1F4N_楼主2024/6/29 11:53

如题,不知道为什么长剖被卡空了,是否是长剖假了。

#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;
}
2024/6/29 11:53
加载中...