提交时间:2023-12-07 21:44:33
运行 ID: 24021
#include<iostream> #include<vector> #include<algorithm> using namespace std; const int N=100100; int n,m,t; int w[N],fa[N],son[N],bro[N],siz[N],dfn[N],id[N]; using ull=unsigned long long ; ull S[N],S3[N],v[N]; void dfs(int nd){ dfn[nd]=++dfn[0]; id[dfn[nd]]=nd; siz[nd]=1; for(int i=son[nd];i;i=bro[i])dfs(i),siz[nd]+=siz[i]; } void init(){ cin>>n>>m>>t; for(int i=1;i<=n;i++)cin>>w[i]; for(int i=1;i<=n;i++)cin>>v[i]; for(int i=2;i<=n;i++){ cin>>fa[i]; bro[i]=son[fa[i]]; son[fa[i]]=i; } dfs(1); } vector<ull>f[20],g; void solve(int l,int r,vector<int>ask,int dep){ if(l>r)return; if(ask.empty())return; if(l==r){ int nd=ask[0]; for(ull i=0;i<=m;i++)S[nd]^=f[dep-1][i]*(i+1),S3[nd]^=f[dep-1][i]*(i+1)*(i+1)*(i+1); return; } int mid=(l+r)>>1; int L=l,R=r; g=f[dep-1]; vector<int>askL,askR; // cout<<endl<<mid<<endl; for(int x:ask){ if(dfn[x]<=mid&&mid<dfn[x]+siz[x]){ while(L<dfn[x]){ for(int i=m;i>=w[id[L]];i--)g[i]=max(g[i],g[i-w[id[L]]]+v[id[L]]); L++; } while(R>=dfn[x]+siz[x]){ for(int i=m;i>=w[id[R]];i--)g[i]=max(g[i],g[i-w[id[R]]]+v[id[R]]); R--; } for(ull i=0;i<=m;i++)S[x]^=g[i]*(i+1),S3[x]^=g[i]*(i+1)*(i+1)*(i+1); } else if(dfn[x]+siz[x]<=mid)askL.emplace_back(x); else askR.emplace_back(x); } f[dep]=f[dep-1]; for(int i=mid;i<=r;i++){ for(int j=m;j>=w[id[i]];j--)f[dep][j]=max(f[dep][j],f[dep][j-w[id[i]]]+v[id[i]]); } solve(l,mid-1,askL,dep+1); f[dep]=f[dep-1]; for(int i=l;i<=mid;i++){ for(int j=m;j>=w[id[i]];j--)f[dep][j]=max(f[dep][j],f[dep][j-w[id[i]]]+v[id[i]]); } solve(mid+1,r,askR,dep+1); } inline bool cmp(int a,int b){return dfn[a]<dfn[b];} int main(){ // freopen("read.in","r",stdin); init(); for(int i=0;i<20;i++)f[i].resize(m+1,0); vector<int>ask; for(int i=2;i<=n;i++)ask.emplace_back(i); sort(ask.begin(),ask.end(),cmp); solve(1,n,ask,1); for(int i=2;i<=n;i++)cout<<S[i]<<' '<<S3[i]<<'\n'; return 0; }