1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include<cstdio> #include<vector> #include<algorithm> #define pb push_back #define max(x,y) (x>y?x:y) #define min(x,y) (x<y?x:y) using namespace std; const int N=100005,inf=2e9; int n,W[N],Ans[N],Max[N]; vector<int> Son[N]; struct node{ int p,tag; }; bool operator < (node a,node b){ return a.p>b.p; } inline node mp(int x,int y){ node t;t.p=x,t.tag=y;return t; } inline int read() { int num=0;char ch=getchar(); while (ch>'9'||ch<'0') ch=getchar(); while (ch<='9'&&ch>='0') num=(num<<1)+(num<<3)+(ch^48),ch=getchar(); return num; } inline void put(int x){ if (x) put(x/10),putchar(x%10+'0'); } int main() { n=read(); for (int i=2;i<=n;++i) Son[read()].pb(i); for (int i=1;i<=n;++i) W[i]=read(); for (int i=n;i>=1;--i) { int sum=0,maxn=0,ansmax=0; vector<node> v; for (int j=0;j<Son[i].size();++j) { int to=Son[i][j]; v.pb(mp(Max[to]-W[to],to)),maxn=max(maxn,Max[to]),ansmax=max(ansmax,Ans[to]); } sort(v.begin(),v.end()); for (int j=0;j<v.size();++j) { sum+=W[v[j].tag]; Ans[i]=max(Ans[i],sum+v[j].p); } Max[i]=max(max(Ans[i],sum+W[i]),maxn); Ans[i]=max(Ans[i],max(sum+W[i],ansmax)); } for (int i=1;i<=n;++i) put(Ans[i]),putchar(' '); return 0; }
|