CF1863C 题解
CF1863C MEX Repetition 题解
Links
Description
给你一个长度为
定义一次操作为:
- 按照
从 到 的顺序, 。
注意:一次操作中的每一步改变 不是 同时进行的,即每一步求
你需要求出经过
本题有多组测试数据,
Solution
看到题目,让我们先来模拟一下。
很容易知道,我们在替换时,第一个数总是在上次没出现的数。然后没出现的数就变成了刚才被替换掉的数。假设经过第
虽然我们推出了规律,但这玩意是
但我们可以尝试找一找规律,如果看上面的看不出来就看看下面这个吧。
发现什么了嘛,其实每次的只是相当于上一次平移了一下,因为当前没有的就是刚被替换掉的。
于是我们只需要找到起始的数字就可以了。由于每次移动一个,初始的位置就是
答案从起始位置输出
Codes
#include <bits/stdc++.h> using namespace std; #define int long long #define max_n 310101 void read(int &p) { p = 0; int k = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') { k = -1; } c = getchar(); } while (c >= '0' && c <= '9') { p = p * 10 + c - '0'; c = getchar(); } p *= k; return; } void write_(int x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) { write_(x / 10); } putchar(x % 10 + '0'); } void writesp(int x) { write_(x); putchar(' '); } void writeln(int x) { write_(x); putchar('\n'); } int T,n,k; int nums[max_n],vis[max_n]; void solution() { read(n),read(k); for(int i = 1;i <= n;i++) { read(nums[i]); vis[nums[i]] = 1; } for(int i = 0;i <= n;i++) { if(!vis[i]) { nums[0] = i; break; } } int beg = (n + 2 - (k % (n + 1))) % ( n + 1); // cout<<"@"<<beg<<endl; for(int i = 1;i <= n;i++,beg++) { writesp(nums[beg % (n + 1)]); } puts(""); for(int i = 0;i <= n;i++) { vis[i] = 0; } } signed main() { // freopen("1.in","r",stdin); read(T); while(T--) { solution(); } return 0; }
本文来自博客园,作者:cn_ryh,转载请注明原文链接:https://www.cnblogs.com/yuhang-ren/p/17673673.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步