#include<bits/stdc++.h>
using namespace std;
map<int,int> p,t,early,late;
int main(){
int n,m,flag=1;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>p[i];
}
//初次计算最早开始时间和最晚开始时间
for(int i=1;i<=m;i++){
cin>>t[i];
late[i]=n-t[i]+1;
if(p[i]==0){
early[i]=1;
}
else{
early[i]=early[p[i]]+t[p[i]];
}
if(early[i]+t[i]-1>n){//不能在 n天内完成全部 m项科目的训练
flag=0;
}
cout<<early[i]<<" ";
}
cout<<endl;
//更新有依赖关系的最晚开始时间
for(int i=m;i>0;i--){
if(p[i]!=0){
late[p[i]]=min(late[p[i]],late[i]-t[p[i]]);
}
}
// cout<<"flag="<<flag<<endl;
if(flag==1){
for(int i=1;i<=m;i++){
cout<<late[i]<<" ";
}
}
return 0;
}
这道题最后30分的关键在于,顿顿n天能完成所有项目的前提下,最晚时间也必须满足依赖关系,如下自己写的测试样例:
10 7
0 1 0 3 2 3 0
2 1 6 3 3 4 3
输出结果:
1 3 1 7 4 7 1
5 7 1 8 8 7 8