题面链接
luogu能过,但是学校评测机T98
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define rep(n) for(i=1;i<n;i++)
#include<cstdio>
#include<cstring>
using namespace std;
inline char gtchar() {
static char buf[1000005], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000005, stdin), p1 == p2)? EOF: *p1++;
}
inline int read() {
char ch = gtchar();
int ret = 0;
bool t1 = 0;
while(ch < '0' || ch > '9') t1 |= ch == '-', ch = gtchar();
while(ch >= '0' && ch <= '9') ret = ret * 10 + (ch ^ 48), ch = gtchar();
return t1? -ret: ret;
}
const int MAXN=1e6+10;
long long n,c,f,ans,b[MAXN],s[MAXN],r[MAXN];
long long p[MAXN],u[MAXN],x[MAXN],y[MAXN],i,tmp;
bool flag;
signed main(){
n=read();
rep(n+1) b[i]=read();
rep(n) p[i]=read();
rep(n) u[i]=read();
rep(n){
p[i]>=(b[i]-y[i-1])?(p[i]-=(b[i]-y[i-1]),x[i]=(b[i]-y[i-1])):(x[i]=p[i],p[i]=0);
p[i]>=u[i]?(p[i]-=u[i],r[i]=u[i]):(r[i]=p[i],p[i]=0);
p[i]>b[i+1]?flag=1:(y[i]=p[i],p[i]=0);
}
if(flag) puts("NO");
else{
puts("YES");
for(i=n-1;i;--i){
tmp=b[i+1]-y[i]-x[i+1];
tmp<=r[i]?(r[i]-=tmp,y[i]+=tmp,tmp=0):(tmp-=r[i],y[i]+=r[i],r[i]=0);
tmp<=x[i]?(x[i]-=tmp,y[i]+=tmp):(y[i]+=x[i],x[i]=0);
}
rep(n) ans+=r[i];
printf("%lld\n",ans);
rep(n) printf("%lld %lld %lld\n",x[i],r[i],y[i]);
}
}
代码思路来源于tj第一篇dalao的思路,本来写的if但是为了卡常又改回去了