首页 > 其他分享 >codeforces刷题(1100):1863C_div1+div2

codeforces刷题(1100):1863C_div1+div2

时间:2023-12-30 19:11:27浏览次数:34  
标签:1863C 1100 非负 int codeforces 整数 最小 数组 MEX

C、MEX Repetition

跳转原题点击此:该题地址

1、题目大意

  给定一个数组,要求每次依次从左到右将\(a_i\)替换为当前数组的最小非负整数(每次替换一个数后,最小非负整数也会发生改变)。问你,经过k次的操作后,最终数组是什么。
  注意:该数组的数 和 最小非负整数,是从\(0,1,\cdots,n\)这一共\(n + 1\)个数中选出,每个数必须出现一次。

2、题目解析

  我们发现,每次更换数组时,\(a_1\)会被最小非负整数替换,而\(a_2\)则会被\(a_1\)原来的书替换,以此类推,而\(a_n\)原本的数则会称为新的最小非负整数。
  所以,令最小非负整数为\(x\),则其与原数组生成新的数组:\(a_1,a_2,\cdots,a_n,x\)。
  第一次MEX新数组变为\(x,a_1,a_2,\cdots,a_{n-1},a_n\),\(a_n\)变为新的最小非负整数。所以每次MEX都会将新数组往后移动一格,最后一个到第一个来。
  同时我们注意到,每\(n+1\)次MEX后,数组将会重新变为输入时的数组,所以我们可以对其取余,减少重复操作。

#include<bits/stdc++.h>

using namespace std;

int T;
int n, k;

// 定义第一个最小的非负整数为x,原输入为a1,a2,...,an
// 原理在于:每次都是x覆盖第一个数,然后后面的数依次用前一个被替代的数覆盖
// 所以发现:a1,a2,...,an,x,第一次为x,a1,a2,...a(n-1),an,每次MEX都将数组往后移动一格
void solve()
{
	cin >> n >> k;
	vector<int>f(n + 1);
	set<int>se;
	for(int i = 0; i < n; i++)
	{
		cin >> f[i];
		se.insert(f[i]);
	}
	for(int i = 0; i <= n; i++)
	{
		if(!se.count(i))
		{
			f[n] = i;
			break;
		}
	}
	k %= (n + 1);	// 因为当k次数为n+1的倍数则与输入无异
	if(k == 0)	
		k = n + 1;
	int cnt = n, idx = n - k + 1;	// idx为k次MEX后的第一个头下标
	while(cnt--)
	{
		// 注意顺序:先输出头下标,如何下标++,如果超过范围则返回第一个
		cout << f[idx] << " ";
		idx++ ;
		if(idx == n + 1)
			idx = 0;
	}
	cout << endl;
	
}

int main()
{
	cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}

 

标签:1863C,1100,非负,int,codeforces,整数,最小,数组,MEX
From: https://www.cnblogs.com/Tom-catlll/p/17936674.html

相关文章

  • Codeforces Round 918 (Div
    CodeforcesRound918(Div.4)这是本人打的第一把div4,比赛中AC到了E,算是打cf以来这一个多月的最成绩了,但是div4似乎只有EFG较难,ABC签到题,D是div3签到题。A.OddOneOut判断就行#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while......
  • codeforces刷题(1100):1864B_div1+div2
    B、SwapandReverse跳转原题点击此:该题地址1、题目大意  给你一个字符串和k,你可以对该字符串做一下两个操作:交换\(a_i\)和\(a_{i+2}\)的字符;对\([i,i+k-1]\)这个区间的字符就行反转;问你通过这两个操作后,原字符串所能生成新的字典序最小的字符串是什么。2、题目解......
  • Codeforces 1876G Clubstep.md
    首先考虑暴力的贪心。从\(r\)到\(l\)依次遍历,若\(a_i<x\)则一直进行题目中的操作。正确性是能保证的,因为选后面的\(j\)只能\(+1\),而选\(i\)可以\(+2\),且\(i\)前面的部分都是\(+1\)。考虑转化一下,把对\(i\)进行操作\(k\)次后,\(\forallj\in[1,i),a_j\l......
  • Codeforces Round 918 (Div. 4)赛后总结(前缀和)(set部分用法)
    CodeforcesRound918(Div.4)赛后总结a,b题没啥好说的c题典中典没开longlong一回事,还有判断数a是否为完全平方数直接用sqrt(a)\(^2\)=a的判断就可以d题经典字符串问题首先,我们以一个字符数组的形式存数据。再根据已知cv,cvc两种形式,我们只需要判断c的时候看v是否有用过(可......
  • Codeforces Round 887 (Div. 1)
    CodeforcesRound887(Div.1)A先来个二分。注意到这样一件事:考虑是\(a_i\)失效的最小时间\(t_i\),发现\(t\)有单调性。所以从大到小考虑\(a\),每次相当于将二分的值减去一个值,复杂度\(O(\sumn(\logn+\logk))\)。codeconstintN=2e5+10;intn;llk;lla......
  • Codeforces Round #843 (Div. 2)
    安利一个叫codeforcesbetter的插件  https://greasyfork.org/zh-CN/scripts/465777-codeforces-better今天装了后使用cf体验非常舒适=====A.GardenerandtheCapybaras(easyversion)问字符串s能否切分成3个字符串a、b、c,且满足a<=b&&c<=b或者b>=a&&b>=cs长度<=100,暴力......
  • [Codeforces] CF1538F Interesting Function
    CF1538FInterestingFunction题目传送门题意给定两个正整数\(l,r\)(\(l<r\)),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。位数变化指:\(l=909\),将\(l+1\)后有\(2\)位数字发生变化。\(l=9\),将\(l+1\)后也有\(2\)位数字发生变......
  • codeforces比赛(1):codeforces 918_div4
    A、OddOneOut跳转原题点击此:A题地址1、题目大意  给你三个数,其中两个是相等的,问你还有一个不相等的数是多少。2、题目解析  直接暴力枚举即可,只要找到两个数相等,那么答案就是另一个数。#include<bits/stdc++.h>usingnamespacestd;intT;inta,b,c;voidsol......
  • Codeforces Round 917 (Div. 2)
    A.LeastProduct存在\(a[i]=0\),\(min=0\),不需要任何操作。负数个数为偶数(包括0),\(min=0\),把任意一个改为\(0\)。负数个数为奇数,\(min=\proda[i]\),不需要任何操作。voidsolve(){ intn; cin>>n; vector<int>b,c,d; for(inti=0;i<n;++i){ in......
  • [Codeforces] CF1536C Diluc and Kaeya
    CF1536CDilucandKaeya题意题目传送门给你一个字符串\(S\),其中只包含'K'或'D'两种字符,要求划分这个字符串使得各部分的\(n(D):n(K)\)相同,其中\(n(D)\)表示\(S\)中字符'D'出现的个数,最大化划分后形成的组数。求出\(S\)的所有前缀中的上述答案。思路注意到,如......