Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
23966 | fyq & jbh's LCA | 【BJ】T2 | C++ | 通过 | 100 | 1502 MS | 465956 KB | 2551 | 2023-12-06 09:41:41 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn=1e5+10; inline int read(){ int x=0; short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,dfn[maxn],rnk[maxn],siz[maxn],w[maxn],val[maxn],cnt; ull res1[maxn],res2[maxn]; vector<int>v[maxn]; void dfs(int u){ dfn[u]=++cnt,rnk[cnt]=u,siz[u]=1; for(int x:v[u])dfs(x),siz[u]+=siz[x]; } ll dp[maxn]; struct Querys { int l,r,id; }d[maxn],d1[maxn],d2[maxn],d3[maxn]; bool operator<(Querys a,Querys b){ return a.l<b.l; } void ins(int x){ x=rnk[x]; down(i,m,w[x])dp[i]=max(dp[i],dp[i-w[x]]+val[x]); } void calc(int l,int r,int p,int q){ if(l>r||p>q)return; if(l==r){ up(i,p,q){ res1[d[i].id]=res2[d[i].id]=0; up(j,0,m){ ull id=j+1; res1[d[i].id]^=((ull)dp[j]*id); res2[d[i].id]^=((ull)dp[j]*id*id*id); } } return; } int mid=l+r>>1,cnt1=0,cnt2=0,cnt3=0; up(i,p,q){ if(d[i].r<=mid)d1[++cnt1]=d[i]; else if(d[i].l>mid)d2[++cnt2]=d[i]; else d3[++cnt3]=d[i]; }up(i,1,cnt1)d[p+i-1]=d1[i]; up(i,1,cnt2)d[p+cnt1+i-1]=d2[i]; up(i,1,cnt3)d[p+cnt1+cnt2+i-1]=d3[i]; vector<ll>dp2(m+5); up(i,0,m)dp2[i]=dp[i]; up(i,mid+1,r)ins(i); calc(l,mid,p,p+cnt1-1); up(i,0,m)dp[i]=dp2[i]; up(i,l,mid)ins(i); calc(mid+1,r,p+cnt1,p+cnt1+cnt2-1); up(i,0,m)dp[i]=dp2[i]; int L=l,R=r; up(i,p+cnt1+cnt2,q){ while(L<d[i].l)ins(L++); while(R>d[i].r)ins(R--); res1[d[i].id]=res2[d[i].id]=0; up(j,0,m){ ull id=j+1; res1[d[i].id]^=((ull)dp[j]*id); res2[d[i].id]^=((ull)dp[j]*id*id*id); } } } void slv(){ n=read(),m=read(),read(); up(i,1,n)w[i]=read();up(i,1,n)val[i]=read(); up(i,2,n){int fa=read();v[fa].p_b(i);} dfs(1);up(i,2,n)d[i].l=dfn[i],d[i].r=dfn[i]+siz[i]-1,d[i].id=i; sort(d+2,d+n+1); calc(1,n,2,n); up(i,2,n)printf("%llu %llu\n",res1[i],res2[i]); } int main(){ // freopen("buffoonery.in","r",stdin); // freopen("buffoonery.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }