有人帮我看看这个为什么错了吗?

#include<bits/stdc++.h>
using namespace std;
#define inf 1e18
#define endl '\n'
#define int long long
typedef  long long ll;
typedef pair<int,int> pii;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const int maxn=2e5+9;
int a[maxn];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	int l=0,r=0;//找左边和右边第一个出现的非零数
	bool f1=false;
	vector<pii> vt;
	vector<int> ans(n+1);
	for(int i=1;i<=n;i++){
		if(!f1&&a[i]){
			l=i;
			f1=true;
		}
		if(a[i]){
			r=i;
			vt.push_back({i,a[i]});
			ans[i]=a[i];
		}
	}
	if(r==0){
		for(int i=1;i<=n;i++) cout << i << " ";
		cout << endl;
		return;
	}
	//处理l左边的
	for(int i=l-1;i>=1;i--){
		ans[i]=ans[i+1]+1;
	}
	
	//处理r右边的
	for(int i=r+1;i<=n;i++){
		ans[i]=ans[i-1]+1;
	}
	
	//处理中间的
	if(vt.size()>1){
		int id=vt[0].first;
		int val=vt[0].second;
		for(int i=1;i<vt.size();i++){
			auto [nowi,nv]=vt[i];
			int zeros=nowi-id-1;
			int t=abs(val-nv)-1;
			if(t==-1) t=1;
			if(zeros==0) continue;
			if(zeros<t){
				cout << -1 << endl;
				return;
			}
			if((zeros-t)%2!=0){
				cout << -1 << endl;
				return;
			}
			//先添加必须的数
			for(int j=id+1;j<=id+t;j++){
				if(val>=nv){
					ans[j]=ans[j-1]-1;
				}else{
					ans[j]=ans[j-1]+1;
				}
			}
			//添加循环数
			int f=1;
			for(int j=id+t+1;j<nowi;j++){
				ans[j]=max(nv,val)-1;
				if(f){
					ans[j]-=1;
					f^=1;
				}
			}
			id=nowi;
			val=nv;
		}
	}
	
	for(int i=1;i<=n;i++) cout << ans[i] << " ";
}


signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int t=1;
	//cin >> t;
	while(t--){
		solve();
	}
	return 0;
}

/*
15
0 0 5 0 0 2 0 0 0 4 0 0 5 0 0
*/

全部评论
提醒一下,以下样例没过哦: 5 2 2 2 2 2 -1; 3 1 0 1 1 2 1; 11 0 0 2 0 0 0 0 0 4 0 0
点赞 回复 分享
发布于 04-07 11:53 江西

相关推荐

昨天 15:41
北京大学 C++
点赞 评论 收藏
分享
见见123:简历没有啥问题,是这个社会有问题。因为你刚毕业,没有工作经历,现在企业都不要没有工作经历的。社会病了。
点赞 评论 收藏
分享
05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 15:08
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务