#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=(int)1e6;
#define move asdasdsa
LL b[N+2],p[N+2],u[N+2],bb[N+2]={},pp[N+2]={};
LL move[N+2]={},stay[N+2]={},buy[N+2]={},pre[N+2]={};
LL n,ans=0;
int main(){
ios::sync_with_stdio(false);
cin.tie(0) ; cout.tie(0);
if (fopen("main.inp","r")){
freopen("main.inp","r",stdin);
// freopen("main.out","w",stdout);
}
cin>>n;
for(int i=1;i<=n;++i) cin>>b[i];
for(int i=1;i<n;++i) cin>>p[i];
for(int i=1;i<n;++i) cin>>u[i];
for(int i=1;i<=n;++i) bb[i]=b[i];
for(int i=1;i<=n;++i) move[i]=stay[i]=buy[i]=0;
for(int i=1;i<n;++i){
pp[i]=p[i]-u[i];
int tmp=min(pp[i],bb[i]);
pp[i]-=tmp,bb[i]-=tmp;
if (pp[i]>bb[i+1]){
cout<<"NO\n";
return 0;
}
bb[i+1]-=pp[i];
}
vector<int>stk;
for(int i=1;i<n;++i){
pp[i]=p[i];
int x=min(pp[i],b[i]);
pp[i]-=x,b[i]-=x;
stk.push_back(i);
stay[i]=x;
while (stk.size() && pp[i]>b[i+1]){
int last=stk.back();
int addmore=min(pp[i]-b[i+1],u[last]);
u[last]-=addmore,pp[i]-=addmore;
buy[last]+=addmore;
pre[last+1]+=addmore,pre[i+1]-=addmore;
ans+=addmore;
if (u[last]==0) stk.pop_back();
}
if (pp[i]>b[i+1]){
cout<<"NO\n";
return 0;
}
b[i+1]-=pp[i];
u[i]=min(u[i],pp[i]);
}
cout<<"YES\n";
cout<<ans<<'\n';
for(int i=1;i<n;++i){
pre[i]+=pre[i-1];
stay[i]+=pre[i];
cout<<stay[i]<<' '<<buy[i]<<' '<<p[i]-stay[i]-buy[i]<<'\n';
}
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:15:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
15 | freopen("main.inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |