悬关求调
查看原帖
悬关求调
1293454
jiachenxi123楼主2025/7/28 12:54
/*





优化(p==2)时的时间复杂度





*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+5;
int n,m,q;
bool vis[maxn];
struct node{
    vector<int>e;
    long long bl=0,f,chf;
}v[maxn];
inline void cf(int x){
    vis[x]=1;
    for(auto i:v[x].e){
        if(vis[i])continue;
        v[i].f=x,v[i].chf=v[i].bl-v[x].bl;
        cf(i);
    }
    v[x].bl=0;
    return;
}
inline void hy(int x){
	vis[x]=0;
    for(auto i:v[x].e){
        if(vis[i])v[i].chf+=v[x].chf,hy(i);
    }
    return;
}
signed main(){
	//freopen("ha.in","w",stdout);
	//freopen("hat.in","r",stdin);
    cin>>n;
    for(int i=1,a;i<=n;++i)cin>>v[i].bl;
    for(int i=1,x,y;i<n;++i){
        cin>>x>>y;
        v[x].e.push_back(y);v[y].e.push_back(x);
    }
    v[1].chf=v[1].bl;
    cf(1);
    //cou(1);cout<<"\n";
    //for(int i=1;i<=n;i++)cout<<v[i].bl<<" ";cout<<"\n";
    //for(int i=1;i<=n;i++)cout<<v[i].chf<<" ";cout<<"\n";
    cin>>m;
    for(int i=1,p,x,y;i<=m;++i){
        cin>>p>>x>>y;
        if(p-1){ v[x].bl+=y;for(auto i:v[x].e){ v[i].bl+=y; } }
        else{ v[x].chf+=y; }
    }
    hy(1);
    cin>>q;
    for(int i=1,x;i<=q;++i){cin>>x;cout<<v[x].chf+v[x].bl<<"\n";}
    return 0;
}
2025/7/28 12:54
加载中...