StarSilk 题单笔记-2000

Link


Lexicographically Largest

首先,第 \(i\) 位数字最大贡献是 \(a_i+i\),并且可以全部取到(倒着丢数即可)。

但因为 \(S\) 是不可重集,为了最大化字典序,我们需要把重复的同一个数字 \(x\) 变成 \(x-1,x-2,x-3\dots\)

这很简单,我们把每个 \(a_i+i\) 丢进一个数组 \(b\) 里排倒序,然后 \(b_i>b_{i-1}\) 时把 \(b_i\) 推成 \(b_{i-1}-1\) 就好。

这总是能做到的吗?

是的,因为假设有两个数字相同,它们一定下标不同,把下标小的先拿走就好了。


LuoTianyi and the Floating Islands (Hard Version)

非常好题,使我的大脑旋转。

\(k\) 为奇数时,最优点一定是一个有人的节点。每远离最优点走一步都会使答案更劣,故答案为 \(1\)

\(k\) 为偶数时,最优点可以不是有人的节点。并且不难注意到,最优点集合应当是被最优有人节点包络的连通块。

数点的期望就是每个点对应合法方案数之和再除以总方案数,但是数点要考虑当前点是不是有人点,所以我们不妨数边,点的期望就是边的期望 \(+1\)

使一条边 \((u,v)\) 合法的方案数就是 \(\large \binom{siz_u}{\frac{k}{2}}\binom{siz_v}{\frac{k}{2}}\)


Koxia and Number Theory

存在正整数 \(x\),使得 \(a_i+x\) 两两互质。

反过来就是任意正整数 \(x\)\(a_i+x\) 总有至少两个模 \(k\)\(0\)

对存在两个数相等的情况,肯定是 NO

对元素两两互异的情况呢?

考虑原来模 \(k\) 同余的数在 \(+x\) 后依然同余。所以若对某个数 \(k\),数组分落在每个同余类的元素个数都大于等于 \(2\),则为 NO,否则为 YES


Keshi in Search of AmShZ

“随机走一条”+“最多 \(d\) 天”=走最坏的一条,所以我们若要 Keshi 走一条边,一定要把指向距离终点更远的目标点的边全部断掉。

于是我们从 \(d_n=0\) 开始,每次删去目前 \(d\) 最小的点 \(v\),对所有指向它的点 \(u\)

\[d_{u} := \min(d_u,d_v+out_u+1) \]

其中 \(out_u\) 表示点 \(u\) 的出度。

显然每个点被删去时 \(d\) 已经取到最小值。


Another Array Problem

\(n>3\) 时答案必然是 \(n \cdot mx\),构造方案:选择 \(mx\) 不在的一侧最靠边的两个元素,操作两次都变为 \(0\),然后选端点和 \(mx\),可以把数组的半边刷成 \(mx\),对面重复上面的操作就好。

\(n=3\) 时,全局可以刷成 \(a_1,a_3\),但不能刷成 \(a_2\),所以还要考虑刷成 \(|a_1-a_2|,|a_2-a_3|\) 的情况。

\(n=2\) 时,要么是原状,要么全部刷成 \(|a_1-a_2|\)


Nezzar and Nice Beatmap

蠢了一下下。

一开始想的任意 \(A_{i-1},A_{i},A_{i+1}\) 不合法,\(A_{i-1},A_{i+1},A_{i}\) 必然合法,秒了啊。

然后就 Wrong answer on test 7 了。

因为 \(A_{i-2},A_{i-1},A_{i+1}\) 可能不合法啊。

怎么办怎么办?

其实每跑一次所有不合法位置都会前移一位,那么跑 \(n\) 次就好了啊,看看数据范围,还是秒了啊。

Add:相邻向量点积应该是可以到 8e18 的,理论应该开 __int128,但是 i64 日过去了。


Hospital Queue

建议先写:[HNOI2015] 菜肴制作[NOI2010] 航空管制

套路地,我们将条件二转化为对反图做拓扑,条件一就变为必须在 \(n-k_i\) 次操作后取出。

于是我们用一个小根堆维护各点按 \(n-k_i\) 优先拓扑,则可得到一个合法方案。

然后考虑某个点尽早出现等价于拓扑时尽量晚出堆,那么我们每次把它取出时,考察一下能不能取堆下一位,能则二者交换就好。


Iris and the Tree

每条边只会在两对节点的 dist 上,我们暴力维护每对节点 dist 涉及的不确定边,修改复杂度是 \(\mathcal{O}(1)\) 的。

对于所有边都确定的一条 dist,答案是固定的。

否则答案就是 dist 上固定边权值和加上剩余的 \(w\)


Power Board

注意到各个底数涉及的列是包含而非交叉的关系,对每一组我们都考虑它最大的超集,也就是每一列我们在最小能到达它的底数考虑它,便只需要考虑若干个较小的表内是否有重复元素。

首先,这个较小的表至多只有 \(\log_{a}n\) 行(\(a\) 是表左上角的元素)。

其次,表中元素都是 \(a\) 的整数幂。

所以我们直接取 \(\log\),每个表的目标就都变成求 \(1 \times 1 , 1 \times 2 , \dots , 1 \times m \dots , \log_{a}n \times m\) 中的不重复元素,暴力 \(\mathcal{O}(m \log n)\) 数就好了。


Kaavi and Magic Spell

image

整体还是很典啊。我们记 \(dp_{l,r}\) 为从 \(s_{1 \sim r-l+1}\) 操作得到 \(t_{l \sim r}\) 的方案数。特别地,如果有边界 \(\geq m\),则拓展时可以无视 \(t\) 的限制。

然后暴力 dp 就好了。


AquaMoon and Chess

类似跳棋的规则,我们可以把一次移动的过程看成 11 的一次挪动。

如果遇到 011 可以直接挪过去;如果遇到 111 这次挪动不会产生贡献。

换言之,如果把 0 看成黑球,11 看成白球,答案就是数黑白球排成一列的方案数。

于是我们统计串中 11 的个数 \(a\),与 0 的个数 \(b\),答案就是 \(\binom{a+b}{a}\)

The Human Equation

感觉很 EZ 啊。

我们考虑对原数组做一次前缀和,这样一次操作等价于让前缀和数组一段 \(+1/-1\),一段不动,再一段 \(+1/-1\),再一段不动……

如果某一位需要 \(+1/-1\),我们就推迟不动段;否则就令其不动,这样一定可以让每一位需要 \(+1/-1\) 的元素在加/减的一次操作内被改变。

于是答案就是前缀和极差(算极差的时候记得把 \(0\) 考虑进去)。


Burenka and Traditions (hard version)

秒了啊,首先每次选偶数操作会使代价 \(-1\)

所以要么选相邻两个一起带走,要么选一个单独按一次。

考虑到有某个数等于相邻两个数异或和的情况,dp 就好。

哦哦蠢了,考虑什么时候会对相邻两个数操作:在一段异或和为 \(0\) 的区间上。

每找到一个这样的区间,就能让操作次数 \(-1\)

如果推平了一个区间,后面的操作就不能涉及前面的位置。

所以对于这段区间前面的位置,我们直接每个数操作一次。

答案就是 \(n\) 减去异或和为 \(0\) 的不交区间数。


Cases

每个单词长度不超过 \(k\),求词尾字母的最小字符集 \(S\)

等价于任意 \(k\) 长子串与 \(S\) 有交,厉害吧x

那么对任意 \(k\) 长子串,与其不交的字符集都是串内元素字符集的补集的子集。

于是我们对每个 \(k\) 长子串内元素字符集打上标记,做个高维后缀和,答案就是没有标记的最小集。


Prefixes and Suffixes

两个串一样长,肯定想让它们产生一点一一对应的关系。

一个串操作前缀,另一个串操作后缀,容易想到把另一个串倒过来,操作的就都是前缀了。

现在的操作变成:选择一个长度 \(k\),把两个串的 \(k\) 前缀倒置后上下互换。

发现任取 \(k\) 进行操作,上下相对的两个字符总是并排走(这也是符合直觉的,因为我们的操作对上下串具有对称性)。

我们把上下相对的两个字符看成一组。

那么组内元素能互换吗?

对于第一组,显然是可以的,进行一次 \(k=1\) 的操作即可。

对于第 \(i\) 组,我们可以先进行一次 \(k=i\) 的操作,让它暂时来到第一组的位置,互换一次之后再进行一次 \(k=i\) 的操作,这样就能把第 \(i\) 组上下互换而不影响其他位置。

那么各组间位置可以任意排列吗?

对于第 \(i\) 组,如果 \(i>1\),我们先进行一次 \(k=i-1\) 的操作,再进行一次 \(k=i\) 的操作,就像冒泡一样把第 \(i\) 组推到第一组的位置。

对于任意一个需要的排列 \(p\),我们依次把各组推到第一组的位置即可得到目标排列。

所以要满足题意,只需要各组任意排列、上下互换后能得到两个回文串即可。特别地,如果字符串长度为奇数,要求中间元素相同。

那我们规定每组字典序小的在上大的在下,数一下同样的组是不是都是偶数个,长度为奇数时再小小处理一下就好。


XOR-gun

如果一次操作能够完成,答案当然是 \(1\)

否则,\(\mathcal{O}(n^3)\) 暴力即可。

aa? wsm?

如果一次操作不能完成说明任意相邻三位最高位都不是同一位,而序列不降,所以此时 \(n \leq 60\)


Survey in Class

其实就是给出若干个区间,取出一对使得二者差集最大。

对于两个区间包含的情况,答案一定不优于最长区间长度减去最短区间长度。

对于两个区间相交但不包含的情况,钦定被作差那个区间是区间 \(i\)

当它左部分产生贡献时,选择左端点最大的区间作为另一个区间可以让它贡献取得最大值;

当它右部分产生贡献时,选择右端点最小的区间作为另一个区间可以让它贡献取得最大值。


Multitest Generator

不难发现,答案最多是 \(2\)。构造策略是:将第一个数变为 \(1\),后一个数变为整个后缀长度减 \(1\)

倒着递推一下每个位置对应后缀在不作修改时是否能恰好分成若干个 test,以及分成的 test 个数。

不妨记 \(i\) 后缀能分成的 test 个数为 \(f_i\)。特别地,当其不能恰好分成若干个 test 时,\(f_i=0\)

显然,如果 \(f_{i+1}=a_i\)\(i\) 后缀的答案就是 \(0\)

答案是 \(1\) 的情况就比较复杂了。

如果 \(f_{i+1}>0\),我们将 \(a_i\) 改为 \(f_{i+1}\) 即可,这是一定合法的。

如果 \(f_{i+1}=0\),我们可能改后面的任何一个数。

考虑改一个数有影响,它一定是一个 test 的头部,而它是任意修改的,也就是它所在的 test 可以任意伸缩。

那么只要 \(i\) 之后存在位置 \(j\),使得 \(f_j+1=a_i\),我们把第一个 test 的末尾推/拉到 \(j-1\) 就好了。

又考虑到 \(f\) 从后向前转移时是单调的,所以我们可以做一个后缀 \(max\) 来维护这个过程。

其余情况的答案显然是 \(2\)


Decomposition

每个 \(0\) 选进来必然是要独占一列的,我们单独考虑它:如果第 \(i\) 个数是 \(0\),它所在列的贡献是 \(i \cdot (n-i+1)\)

然后考虑剩下的数,它们只会占据至多 \(3\) 个序列:\(3\) 只会进入第一个序列,剩下 \(1,2\) 至多各占一个序列。一个占满三个序列的进入顺序是 \(\{ 1,2,3,2,1,3 \}\)

于是我们记 \(dp_{i,j,k}\) 是现在第一个序列末位为 \(i\),第二个序列末位为 \(j\),第三个序列末位为 \(k\) 的方案数,然后遍历 \(a\) 中元素。

首先让 \(dp_{0,0,0}\) 加一,代表区间此处开始的方案。

如果当前遍历元素非 \(0\),尝试按照定义将其转移;否则不发生转移。

然后将当前每个状态方案数 \(\times\) 该状态非空序列数计入答案。


Between

\(\left( a_i,b_i \right)\) 的约束就是说:\(x+1\)\(a_i\) 中至少要交错穿插着 \(x\)\(b_i\)

假如相互存在约束的若干个数都没有个数限制,显然可以取这若干个数的某个排列不停复制,不破坏合法性。

但是 \(1\) 存在个数限制啊。

我们先不妨把 \((a_i,b_i)\) 看成一条 \(a_i\)\(b_i\) 的有向边。

如果某点存在一条到 \(1\) 的边,它就只能在 \(1\) 的左右各出现 \(1\) 次。

以此类推,如果某点到 \(1\) 的最短路径长度是 \(d\),它只能出现 \(d+1\) 次,且两两之间都必须有一部分到 \(1\) 最短路径长度不到 \(d\) 的点。

一个简单而合法的策略是:记到 \(1\) 最短路径长度为 \(d\) 的点集为 \(S_d\),构造下面的序列:

\[\begin{aligned} Ans = \{ S_{n-1},S_{n-2},S_{n-3},\dots,S_2,S_1,1&, \\ S_{n-2},S_{n-3},\dots,S_2,S_1,1&, \\ S_{n-3},\dots,S_2,S_1,1&, \\ \dots \dots \dots \dots&, \\ S_2,S_1,1&,\\ S_1,1&,\\ 1&\} \end{aligned} \]

所以我们只要建反图跑个 BFS 求出 \(1\) 到每个点的最短路就好。


Turtle Magic: Royal Turtle Shell Pattern

有点难发现,答案最多是 \(8\)

首先 \(4 \times 4\) 的矩阵答案为 \(8\)

对这 \(8\) 种矩阵,它们行行轮换或列列轮换后得到的矩阵也在这 \(8\) 个之中。或者说,轮换运算对这组矩阵是封闭的,所以 \(n,m \geq 5\) 时,答案至少为 \(8\)

那为什么要求 \(n,m \geq 5\) 而不是 \(n,m \geq 4\) 呢?

\(n=4/m=4\) 时,答案其实是可能超过 \(8\) 的。

但是从 \(n=m=5\) 的矩阵开始考虑,首先,它的合法方案数依然只有 \(8\) 种,并且第 \(5\) 行和列恰好与第 \(1\) 行和列一致。

然后我们试图添加一行或一列,发现合法添加方案都是唯一的,且与第 \(i \bmod 4 + 1\) 行/列一致。

所以 \(n,m \geq 5\) 时,答案至多为 \(8\)

至于固定 \((i,j)\) 的黑白,当成固定 \((i \bmod 4 + 1,j \bmod 4 + 1)\) 位置做就好了。

posted @ 2024-10-16 19:44  jzcrq  阅读(64)  评论(0编辑  收藏  举报