Codeforces Round #782 (Div. 2) D (思维)

本文介绍了一种解决算法问题的方法,通过分析当前位置的1和0如何影响后续元素,实现了一个动态维护01串的程序。代码展示了如何根据输入的整数数组a,确定答案串ans中每个位置的值,以保持序列不严格单调递增。
摘要由CSDN通过智能技术生成

传送门

大概就是去考虑当前位置的1与0所代表的a[i]对后面的影响

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pll pair<long long,long long>
#define INF 0x7fffffff
//const int mod=
//mt19937 rnd(std::chrono::system_clock::now().time_since_epoch().count());
//uniform_int_distribution<long long> dist(0, 100000);//随机数限定范围:dist(rnd);
const int maxn=200010;
int n,a[maxn],ans[maxn];//a记录值,ans记录答案的01串
void solve()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		ans[i]=1;//默认为1,之后挖去部分
	}
	int pos=0;//pos记录最后一个【可确定的】0位置,是不严格单调递增的
	for(int i=1;i<=n;i++)
	{
		if(pos<i) ans[i]=(bool)a[i];//如果在确定位置之外,通过a来判断是否为1,主要用于刚开始时判断头几个
		if (ans[i]) ans[pos=a[i]+1]=0;//如果某位置是某个1串中的1,那么之后会有某段空位来放下这一串1
		else ans[pos=a[i]+i]=0; //如果某位置是0,那么之后有某段空位放下之前的1串(a[i]是该位置前1串的长度)
	}
	for(int i=1;i<=n;i++) printf("%d ",ans[i]);
	puts("");
}
signed main()
{
	int test=1;
	scanf("%d",&test);getchar();
	while(test--)
	{
		solve();
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值