【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;
}

 

posted @ 2023-03-14 10:49  #Cookies#  阅读(166)  评论(0)    收藏  举报