1 条题解

  • 0
    @ 2024-4-10 18:08:43

    一开始看到题目的时候肯定会感觉没什么思路吧,

    那么我们不妨先从简单的考虑,从 n=2n=2 开始考虑:

    我们自己把几种可能的输出 Yes 的情况全都枚举出来,找找规律(对称的只算一种):

    0 00\text{ }0(即初始状态)

    0 10\text{ }1(选取 222\sim2 的区间;和 1 01\text{ }0 是对称的,先不考虑 1 01\text{ }0

    2 32\text{ }3(选取 121\sim2 的区间)

    2 02\text{ }0(选取 222\sim2 的区间)

    3 13\text{ }1(选取 121\sim2 的区间)

    3 03\text{ }0(选取 222\sim2 的区间)

    4 14\text{ }1(选取 121\sim2 的区间)

    \ldots

    我们发现一件有趣的事情:

    结论一:有 00 的长度为 22 的序列都能输出 Yes

    有了这个结论,我们发现一个序列里面有很多值都可以满足了。

    举个例子:

    我们让 n=5n=5a1=2,a2=6,a3=2,a4=3,a5=5a_1=2,a_2=6,a_3=2,a_4=3,a_5=5

    那么我们可以只对相邻两个数进行操作:

    0 0 0 0 00\text{ }0\text{ }0\text{ }0\text{ }0

    2 0 0 0 02\text{ }0\text{ }0\text{ }0\text{ }0(把 121\sim2 的区间 0 00\text{ }0 变为 2 02\text{ }0(结论一))

    2 6 0 0 02\text{ }6\text{ }0\text{ }0\text{ }0(把 232\sim3 的区间 0 00\text{ }0 变为 6 06\text{ }0(结论一))

    同时我们还可以从后面往前搞:

    2 6 0 0 52\text{ }6\text{ }0\text{ }0\text{ }5(把 454\sim5 的区间 0 00\text{ }0 变为 0 50\text{ }5(结论一))

    但是,只剩一个 00 的时候我们并不能这样。

    所以,我们又得到了 结论二:如果有任意一个子序列输出 Yes,那么肯定输出 Yes,否则肯定输出 No结论三:如果一个序列有 00,输出 Yes

    那么我们现在就要寻找这个子序列了(结论二)。

    我们已经把它变成 2 6 0 0 52\text{ }6\text{ }0\text{ }0\text{ }5 了,那么中间的 00 它肯定还要继续变,因为我们目前操作后这个序列里有 00(最后会至少剩下一个 00),所以 mex1mex\ge 1,那么目前这个序列的 minmin 肯定是 00,同时我们还能得到目前这个序列有 0mex10\sim mex-1 的数,且没有 mexmex 这个数(mexmex 的定义),那么,我们对它进行一次操作,那么变化后它就会有 mex2×mex1mex\sim 2\times mex-1 的数,且没有 <mex<mex 的数,也没有 2×mex2\times mex 这个数。

    那么我们如何找到这个子序列呢?如果暴力枚举每个区间,时间复杂度 O(Tn3)O(Tn^3),无法通过此题。

    那么如何优化呢?我们可以先枚举 mexmex 的值,可以发现一共只有 nn 个数,所以 mexmex 不超过 nn,接下来,如何 O(n)O(n) 找到这个序列呢?

    我们想到如果出现 <mex<mex 或者 2×mex2\times mex 的值,我们肯定不要选它,其他的肯定选得越多越好,可以用一个数组维护一个数是否出现,但是如果超过 2×mex2\times mex,就不记录(因为它肯定不会对答案产生影响)。然而,我们发现清空这个数组就变成 O(n)O(n) 的了,时间复杂度依旧 O(Tn3)O(Tn^3)

    既然清空慢,那么我们优化它就可以了,那么怎么优化呢?

    还记得线段树的 lazy-tag 吗?现在每个 mexmex 的值都有一个类似 lazy-tag 的东西,每一次清空,相当于用 lazy-tag 记录一下。

    现在,我们可以用一个变量记录整个数组被清空的次数,再用一个数组记录每个元素被清空的次数,如果我们要清空,那么把整个数组被清空的次数加 11,再要用到这个数的时候,先看该元素被清空的次数是否等于整个数组被清空的次数,如果小于,那么把被清空的次数改为整个数组被清空的次数,再把这个值归零即可。

    现在清空也变成 O(1)O(1) 的了,总时间复杂度 O(Tn2)O(Tn^2).

    信息

    ID
    864
    时间
    200ms
    内存
    32MiB
    难度
    6
    标签
    (无)
    递交数
    41
    已通过
    3
    上传者