【csp-2】训练计划
拿到题目的第一遍思路是觉得是树形DP(参考没有上司的舞会)进一步敲代码时候发现模拟即可(find类似并查集的操作)只需要判断出先后顺序即可,附上70分的模拟代码
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<bits/stdc++.h> using namespace std; int n,m,sum=1,f[105],t[105],k,ans[105],b[105]; void find(int x){ if(f[x]==0) { k=sum; return; } sum+=t[f[x]]; find(f[x]); sum-=t[f[x]]; } bool work_pd(){ for(int i=1;i<=m;i++){ if(f[i]==0) { b[i]=n+1-t[i]; continue; } b[i]=n-(ans[i]+t[i]-1); if(b[i]<=0) return 0; } return 1; } int main(){ freopen("csp2.in","r",stdin); freopen("csp2.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&f[i]); for(int i=1;i<=m;i++) scanf("%d",&t[i]); for(int i=1;i<=m;i++){ if(f[i]==0){ printf("1 "); continue; } sum=1; find(i); ans[i]=k; printf("%d ",k); } cout<<endl; if(work_pd()==0) return 0; for(int i=1;i<=m;i++) printf("%d ",b[i]); return 0; }