Codeforces 1942B Bessie and MEX 题解

题目简述

给定一个长度为 n 的数组 a,让你构造一个等长的排列 p,其中从 0n1 的每个整数恰好出现一次。满足对于每一个位置 ai=MEX(p1,p2,,pi)pi,其中数组的 MEX 是不在该数组中出现的最小非负整数。

题目分析

我们发现正着做并不是十分好做,依据正难则反的思想,我们考虑倒着做。

我们首先考虑构造 pn。为了方便一些,我们令 mexi=MEX(p1,p2,,pi)。因为 p 是一个从 0n1 的排列,所以 mexn=n,由于 ai=mexipi,所以可以推出 pn=mexnan,这样我们就知道了 pn 的值。对于其他的 pi,我们也可以效仿这种方法。现在,我们只需要知道 mexi 就可以了。

我们考虑如何求解 mexi,首先,我们求 pi 的值的时候,肯定已经知道了 pi+1pn 的值了,由于 p 是一个排列,所以在 p1pipi+1pn 一定没有出现过且不可能出现大于 pi+1pn 的数,再根据 MEX 的定义,我们便可知 mexi=mini+1jn pj。然后这道题就做完了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,n,a[N],p[N],mex;
void solve()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	} 
	mex=n;
	for(int i=n;i>=1;i--)
	{
		p[i]=mex-a[i];
		mex=min(p[i],mex);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<p[i]<<" ";
	}
	cout<<"\n";
	return;
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>T;
    while(T--)
    {
    	solve();
	}
	return 0;
}
posted @   zhuluoan  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示