首页 > 其他分享 >CF1942B Bessie and MEX 题解

CF1942B Bessie and MEX 题解

时间:2024-04-13 19:45:42浏览次数:23  
标签:CF1942B int 题解 texttt mex Bessie 我们 MEX sim

题目简述

给定一个长度为 $n$ 的数组 $a$,让你构造一个等长的排列 $p$,其中从 $0$ 到 $n-1$ 的每个整数恰好出现一次。满足对于每一个位置 $a_i=\texttt{MEX}(p_1,p_2, \ldots, p_i) - p_i$,其中数组的 $\texttt{MEX}$ 是不在该数组中出现的最小非负整数。

题目分析

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

我们首先考虑构造 $p_n$。为了方便一些,我们令 $mex_i=\texttt{MEX}(p_1, p_2, \ldots, p_i)$。因为 $p$ 是一个从 $0$ 到 $n-1$ 的排列,所以 $mex_n=n$,由于 $a_i=mex_i-p_i$,所以可以推出 $p_n=mex_n-a_n$,这样我们就知道了 $p_n$ 的值。对于其他的 $p_i$,我们也可以效仿这种方法。现在,我们只需要知道 $mex_i$ 就可以了。

我们考虑如何求解 $mex_i$,首先,我们求 $p_i$ 的值的时候,肯定已经知道了 $p_{i+1} \sim p_n$ 的值了,由于 $p$ 是一个排列,所以在 $p_1 \sim p_i$ 中 $p_{i+1} \sim p_n$ 一定没有出现过且不可能出现大于 $p_{i+1} \sim p_n$ 的数,再根据 $\texttt{MEX}$ 的定义,我们便可知 $mex_i=\min_{i+1 \leq j \leq n~}{p_j}$。然后这道题就做完了。

代码

#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;
}

标签:CF1942B,int,题解,texttt,mex,Bessie,我们,MEX,sim
From: https://www.cnblogs.com/zhuluoan/p/18133273

相关文章

  • CF244B Undoubtedly Lucky Numbers 题解
    题目简述给定一个$n$,问有多少个小于等于$n$的数只由两个不同的数字$x$和$y$组成。题目分析直接枚举肯定不行,我们考虑枚举$x$和$y$,再利用深搜,生成所有不大于$n$且只由$x$和$y$组成的数字,利用map去重,统计答案即可。代码#include<iostream>#include<map>usi......
  • 2023CCPC题解
    2023年第五届河南省CCPC大学生程序设计竞赛ProblemA.小水獭游河南#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){stringa;cin>>a;intst[27],ji=0;memset(st,0,sizeof(......
  • CF1946B Maximum Sum 题解
    题目简述你有一个由$n$个整数组成的数组$a$。你要对它进行$k$次操作。在一次操作中,你选择了数组$a$的任意连续子数组(可能为空),并在数组的任意位置插入了该子数组的和。你的任务是找出经过$k$次操作后数组的最大和。题目分析这道题显然是一道贪心题。对于第$1$次操......
  • 集合计数——题解
    题目这篇题解的背景。。。(可以跳过,与题目无关)说实话,有点恼,也觉得自己有点唐,在以为自己已经理解了变量意义的情况下(实际上并没有)去推了半天错式子,甚至我推出了他不对时还给自己否定了,昨天晚三还拉着\(9G\)与我一块推。。。,结果上午发觉好像意义理解错了。。。抽象,就当是一种......
  • CF416E 题解
    前置知识:floyd题意给定一个\(n\)个点\(m\)条边的无向简单图,对于每对\((s,t),1\les<t\len\),求出有多少条边被至少一个\(s\tot\)的路径经过。\(n\le500,m\le\frac{n(n-1)}{2}\)题解首先一个很一眼的做法先floyd一遍求出\(dis(i,j)\),接着枚举\((s,......
  • [CF1954] Educational Codeforces Round 164 (Rated for Div. 2) 题解
    [CF1954]EducationalCodeforcesRound164(RatedforDiv.2)题解A.PaintingtheRibbon最优策略是染\(\lceil\dfrac{n}{m}\rceil\)个颜色,然后Bob会把剩下的都染成这个颜色voidwork(){intn,m,k,c;cin>>n>>m>>k;c=(n+m-1)/m;......
  • CF1618G Trader Problem 题解
    CF1618GTraderProblem题解题目链接:CF|洛谷提供一个在线做法。分析1我们不妨把\(a\)和\(b\)合并为一个序列,称合并后的序列为\(c\),并将其不降序排序。把玩样例后不难发现:对于一个物品序列\(c_1,c_2,\cdots,c_l\),满足\(\foralli<l,c_{i+1}-c_i\lek\)(即任意......
  • [CF1942] CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes! A~E 题解
    [CF1942]CodeTONRound8(Div.1+Div.2,Rated,Prizes!A~E题解A.FarmerJohn'sChallenge只有两种情况,一种是单调递增,这时\(k=1\),另一种是所有数都相同,这时\(k=n\)。B.BessieandMEX首位可以确定,然后从前往后增量构造\(p\)即可。voidwork(){cin>>......
  • CF1837E Play Fixing 题解
    首先来考虑什么情况方案数为\(0\):可以确定,在某一层中,两个原本都能晋级的队伍比赛;可以确定,在某一层中,两个原本都不能晋级的队伍比赛。发现假如写出每一场比赛及其胜者,可以形成一棵树形结构,在里面打标记即可判断是否为\(0\)。我们设\(a_i\)表示第\(i\)层新加的队伍中位......
  • [题解][2022年江西省大学生程序设计竞赛] Remove and append
    题目描述给定一个包含n个整数的数组a。定义一个操作如下:从数组a中选择k个整数,将它们删除,并将它们的和追加到数组末尾。如果数组A比数组B(长度相同)字典序大,那么在A和B第一次不同的位置上,A的数字比B对应位置上的数字要大。例如,[0,1,14,0]比[0,1,5,6]字典序大,因为它们在第三......