Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
23889 yuanjiabao 【BJ】T1 C++ 通过 100 58 MS 15196 KB 1848 2023-12-02 19:51:56

Tests(20/20):


#include<iostream> #include<cstring> using namespace std; #define int long long inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=100100,inf=0x3f3f3f3f3f3f3f3f; int n,q,rt,a[N][3],head[N],to[N<<1],nex[N<<1],L; int dep[N]; int f[N][4];//nd i,state of fa is j,state of this is k int g[N][2]; int ans[N]; void get_dep(int nd,int fa=0){ for(int i=head[nd];i;i=nex[i])if(to[i]!=fa)dep[to[i]]=dep[nd]+1,get_dep(to[i],nd); ans[dep[nd]+1]+=max(a[nd][1],a[nd][2]); } void init(){ cin>>n>>q; for(int i=1;i<=n;i++)a[i][1]=read(); for(int i=1;i<=n;i++)a[i][2]=read(); cin>>rt; for(int i=1;i<n;i++){ int u=read(),v=read(); to[i<<1]=v; nex[i<<1]=head[u]; head[u]=i<<1; to[i<<1|1]=u; nex[i<<1|1]=head[v]; head[v]=i<<1|1; } get_dep(rt); for(int i=1;i<=n;i++)ans[i]+=ans[i-1]; } void dp(int nd,int fa=0){ for(int i=head[nd];i;i=nex[i])if(to[i]!=fa)dp(to[i],nd); f[nd][0]=0; f[nd][1]=a[nd][1]; f[nd][2]=a[nd][2]; int mn=inf; for(int i=head[nd];i;i=nex[i])if(to[i]!=fa){ f[nd][0]+=g[to[i]][0]; f[nd][1]+=g[to[i]][1]; f[nd][2]+=g[to[i]][1]; mn=min(mn,g[to[i]][1]-f[to[i]][0]); } f[nd][3]=f[nd][2]-mn; g[nd][0]=max(max(f[nd][0],f[nd][1]),f[nd][2]); g[nd][1]=max(max(f[nd][0],f[nd][1]),f[nd][3]); ans[dep[nd]]+=max(g[nd][0],g[nd][1]); } signed main(){ // freopen("read.in","r",stdin); // freopen("tree.out","w",stdout); init(); dp(rt); while(q--){ int x=read(); if(x==0){ printf("%lld\n",g[rt][1]); } printf("%lld\n",ans[x]); } return 0; }


测评信息: