【悬关】WA 20pts求助
查看原帖
【悬关】WA 20pts求助
1022907
lql1楼主2024/10/14 20:51

只过了Subtask#1,#2、#3、#4、#5等红绿相间,可能反悔部分有问题

#include<bits/stdc++.h>
#include<bits/extc++.h>

using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;

#define ll long long
#define elif else if
#define sf scanf
#define pf printf
#define int ll
const int MAXN=1e6+5;
vector<int> b,p,u;
int n;
struct node {
	int lst,umb,sec;
} ans[MAXN];
signed main() {
	freopen("Umb.txt","r",stdin);
	freopen("UU.txt","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	b.resize(n);
	p.resize(n);
	u.resize(n);
	for(int i=0; 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];
	auto bb=b;
//	auto bb=b,pp=p,uu=u;
	//模拟无解
	const int Right=b[n-1];
	for(int i=1; i<n; i++) {
		if(b[i-1]>0) {
			//左边可以塞
			if(p[i]<=b[i-1]) {
				//左边塞得下全部
//				cout<<"Left All"<<endl;
				b[i-1]-=p[i];
				ans[i].lst=p[i];
				p[i]=0;
				continue;
			} else {
				//左边装不下全部
//				cout<<"Left Some"<<endl; 
				ans[i].lst=b[i-1];
				p[i]-=b[i-1];
				b[i-1]=0;
				//先全部去买伞
				if(u[i]>=p[i]) {
//					cout<<"Left All Umb"<<endl;
					ans[i].umb=p[i];
					u[i]-=p[i];
					p[i]=0;
					continue;
				} else {
//					cout<<"Left Some Umb"<<endl;
					ans[i].umb=u[i];
					p[i]-=u[i];
					u[i]=0;
				}
				//还有剩余 去右边
				if(b[i]>=p[i]) {
//					cout<<"Right All"<<endl;
//					cout<<"B[i]="<<b[i]<<" P[i]="<<p[i]<<endl;
					ans[i].sec=p[i];
					b[i]-=p[i];
					p[i]=0;
				} else {
					cout<<"NO";
					return 0;
				}
			}
		} else {
			//左边塞不下了
			//先全部去买伞
			if(u[i]>=p[i]) {
//				cout<<"NOLeft All Umb"<<endl;
				ans[i].umb=p[i];
				u[i]-=p[i];
				p[i]=0;
				continue;
			} else {
//				cout<<"NOLeft Some Umb"<<endl;
				ans[i].umb=u[i];
				p[i]-=u[i];
				u[i]=0;
			}
//			if(!p[i]) continue;
			//还有剩余 去右边
			if(b[i]>=p[i]) {
//				cout<<"NOLeft Right All"<<endl;
				ans[i].sec=p[i];
				b[i]-=p[i];
				p[i]=0;
			} else {
				cout<<"NO";
				return 0;
			}
		}
//		cout<<ans[i].lst<<' '<<ans[i].umb<<' '<<ans[i].sec<<endl;
	}
//	cout<<endl;
//	for(int i=1;i<n;i++) {
//		cout<<ans[i].lst<<' '<<ans[i].umb<<' '<<ans[i].sec<<endl;
//	}
	cout<<"YES"<<endl;
	for(int i=n-1;i>0;i--){
		if(b[i]>0){
			if(b[i]&&b[i]>ans[i].umb){
				b[i-1]+=(b[i]-ans[i].umb);
				ans[i].sec+=ans[i].umb;
				ans[i].umb=0;
				
			}else{
				ans[i].umb-=b[i];
				ans[i].sec+=b[i];
				b[i]=0;
			}
		}
	}
	int bought=0;
	for(int i=1;i<n;i++) bought+=ans[i].umb;
	cout<<bought<<endl;
	for(int i=1;i<n;i++) {
		cout<<ans[i].lst<<' '<<ans[i].umb<<' '<<ans[i].sec<<endl;
	}
	return 0;
}
2024/10/14 20:51
加载中...