首页 > 其他分享 >CF1863C 题解

CF1863C 题解

时间:2023-09-02 15:01:45浏览次数:35  
标签:right int 题解 void CF1863C leq array left

CF1863C MEX Repetition 题解

洛谷

Codeforces

Description

给你一个长度为 \(n\) 的序列 \(a\),满足 \(\forall i \in [1,n]\),\(0 \leq a_{i} \leq n\) 且序列中的数互不相同。

定义一次操作为:

  • 按照 \(i\) 从 \(1\) 到 \(n\) 的顺序,\(a_{i} \gets \operatorname{MEX}(a_{1} \ldots a_{n})\)。

注意:一次操作中的每一步改变 不是 同时进行的,即每一步求 \(\operatorname{MEX}\) 的序列 \(a\) 都在上一步被改变。

你需要求出经过 \(k\) 次操作之后的序列 \(a\)。

本题有多组测试数据,\(1 \leq T,n,\sum n \leq 10^5\),\(1 \leq k \leq 10^{9}\)。

Solution

看到题目,让我们先来模拟一下。

\[\begin{array}{c} \left \{1,2,3,4,5 \right\} \\ \left \{0,1,2,3,4 \right\} \\ \left \{5,0,1,2,3 \right\} \\ \left \{4,5,0,1,2 \right\} \\ \left \{3,4,5,0,1 \right\} \\ \left \{2,3,4,5,0 \right\} \\ \left \{1,2,3,4,5 \right\} \\ \end{array}\]

很容易知道,我们在替换时,第一个数总是在上次没出现的数。然后没出现的数就变成了刚才被替换掉的数。假设经过第 \(i\) 次替换的序列中第 \(j\) 个数是 \(a_{i,j}\),那么有 \(a_{i,1} = a_{i-2,n}\),\(\forall j \in [2,n]\),\(a_{i,j} = a_{i - 1,j - 1}\)。

虽然我们推出了规律,但这玩意是 \(O(nk)\) 的,炸裂 TLE。

但我们可以尝试找一找规律,如果看上面的看不出来就看看下面这个吧。

\[\begin{array}{c} \left \{1,2,3,4,5,(0) \right\} \\ \left \{0,1,2,3,4,(5) \right\} \\ \left \{5,0,1,2,3,(4) \right\} \\ \left \{4,5,0,1,2,(3) \right\} \\ \left \{3,4,5,0,1,(2) \right\} \\ \left \{2,3,4,5,0,(1) \right\} \\ \left \{1,2,3,4,5,(0) \right\} \end{array} \]

发现什么了嘛,其实每次的只是相当于上一次平移了一下,因为当前没有的就是刚被替换掉的。

于是我们只需要找到起始的数字就可以了。由于每次移动一个,初始的位置就是 \((1 - k) \bmod (n + 1)\)。负数取模请自行处理。

答案从起始位置输出 \(n\) 个就可以了。

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

标签:right,int,题解,void,CF1863C,leq,array,left
From: https://www.cnblogs.com/yuhang-ren/p/17673673.html

相关文章

  • CF1863B 题解
    CF1863BSplitSort题解Links洛谷CodeforcesDescription给定一个\(1\simn\)的排列\(q\),你可以多次进行以下操作:新建一个初始为空的序列\(q\);选择一个整数\(x\)(\(2\leqx\leqn\));按照在\(p\)中出现的顺序将所有小于\(x\)的数添加到序列\(q\)末尾。按照在......
  • P1463 [POI2001] [HAOI2007] 反素数 题解
    P1463[POI2001][HAOI2007]反素数题解可以发现,最大的不超过\(n\)的反素数就是\(1\simn\)中因数最多的数字。证明:设\(x,x\in[1,n]\)为\(1\simn\)中因数最多的数字,则\(x<y\len\)都不会成为答案,因为存在\(x<y\)因数比\(y\)多,同时也不会存在\(y'<x\)......
  • vmware中的疑难问题解决方法
    converter在windows中使用的agent服务端口9089,vcenter使用443端口。converter再windows中不能启动服务的解决方法:1.开启TLS1.01.11.2。在programdata中更改SSLOPTIONS的值为:56313856。可以尝试官方方法2.禁用网络连接:在注册表中localmachine-system-currentcontrolset-contro......
  • CF 1863D 题解
    CF1863DTwo-ColoredDominoes题解Links洛谷CodeforcesDescription有一个\(n\timesm\)的棋盘,上面铺着一些\(1\times2\)的多米诺骨牌(横竖均有可能),骨牌之间没有重叠。你需要找到一种染色方案满足以下条件:每个多米诺骨牌一端被染白,另一端被染黑。其他没有骨牌的格子......
  • 题解 [AGC004D] Teleporter
    题目链接躺在床上想到重要性质的题目。。。首先,由于每个城市只有一个可以直接到达的城市,所以\(n\)个城市就有\(n\)条边,容易发现这是一棵基环树,那么我们先从普通树的角度考虑,若要求每个点走\(k\)条边恰好到\(1\)号节点,这个环必须加在哪里。若\(k=1\),没有环显然也是可行......
  • GCD Counting题解
    题意有一棵有\(n\)个节点的树,第\(i\)个节点有点权\(a_i\)。定义\(g(x,y)\)为\(x\)到\(y\)的树上路径所经过的点的点权\(\gcd\)。对于每一个正整数\(k\in[1,2\times10^5]\)求出满足以下条件的\(x,y\)的对数:\(1\lex\ley\len\)\(g(x,y)=k\)\(1\len......
  • CF915G Coprime Arrays 题解
    题意给定\(n,k\),对于所有的\(m\in\left[1,k\right]\),求长度为\(n\),值域为\(\left[1,m\right]\)且最大公约数为\(1\)的序列种数,对\(10^9+7\)取模。(\(1\len,k\le2\times10^6\))。题解设\(f(d,m)\)表示长度为\(n\),值域为\(\left[1,m\right]\)且最大......
  • [NOI2021] 轻重边题解
    题目传送门一眼数据结构考虑树上有什么数据结构支持\(x\)到\(y\)节点的修改和查询,那就是:树链剖分。那么这道树链剖分的题有个\(trick\):边点转换&染色法,对于每次修改,考虑将修改路径上的点全部染上一种独一无二的颜色,而查询的时候,就查询路径上相邻的相同的颜色节点个数即可......
  • 爱思创模拟06试题易错题解析
    错误原因:漏项正确答案:C按节点数分类穷举 举一反三:  错误原因:处理三个空位的时候,情况考虑的太多正确答案:分情况计算,先枚举4个人共A(4,4)=24种情况,再考虑剩下两个空位置的情况,即A(5,2)=20种情况,最终答案就是24*20=480种举一反三:  错误原因:不会计算时间复杂度......
  • 题解 正妹吃月饼
    题目链接由于每个质量的月饼只有一个,并且质量恰好是2的整数倍,所以考虑将一个质量看成一个二进制位。那么也就是说,我们要构造一个二进制数\(x\),使得\(x\)的\(1\)的个数最多,且满足\(a\lex\leb\)。那么这就可以用类似数位\(DP\)的思路来做,从高位往低位看,若\(a_i=b_i=1......