CF1787
A
简单,不过我蠢
偶数构造显然。
奇数不存在合法方案,不用枚举。
B
简单贪心。
C
每个 \(x_i\) 的取值最多有两个,因为如果不取到边界,那么向左或者向右调整一定会变得更优。
直接做一遍动态规划即可。
D
简单图论
E
考虑能构造的一个必要条件,异或值本身需要满足且最高位的个数足够。
注意到对于连续的一段 \([1,n]\),高一位的 \(1\) 的个数不会多于低一位的 \(1\) 的个数,证明考虑最高位 (\(n\)) 和次高位 (\(n-1\)),次高位在最高位出现之前就取到了 \(2^{n-1}\),最高位为 \(1\) 时,最多有 \(2^{n-1}\) 个数取不到次高位。
对于最高位个数足够的情况,取拥有最高位的 \(k\) 个数,以及 \(a_i\oplus x\),由于异或的性质,被取到的剩下的数一定互不相同,且这样构造取到了理论最大值,将剩下的数随便塞进一组里,由于异或值本身需要满足的必要条件,一定不影响异或结果。
注意特判 \(x\oplus0\) 的情况。
F
定义排列乘法为 \(a=b\cdot c,a_i=b_{c_i}\)。
给定一个排列 \(p\) ,问是否存在一个排列 \(q\) 满足 \(q^{2^k}=p\),如果存在,构造一种循环个数最小的 \(q\),否则报告无解。
对于 \(q\) 的每个循环我们考虑乘方之后会怎样。
将一个循环 \(w\) 写出,例如 \(1,2,3,4\),自乘一遍之后变成 \(1,3;2,4\),再自乘一遍(乘最开始的排列)变为 \(1,4,3,2\)。如果以图的形式表现,\(w^p\) 表现为将第 \(i\) 个点的边连到第 \(i+p\) 个点,注意到如果 \(\gcd(p,len)\ne 1\),那么循环个数就会减小。
考虑变换后的排列 \(p\),求出其所有循环,对于奇数长度的循环,可以将它们以 \(2^i\) 的形式合并起来,这样得到的循环个数是最小的,注意 \(i>k\) 的情况。
对于偶数长度的循环,如果个数不足 \(2^k\),那么它们就无法被拼接起来,否则也只能以 \(2^k\) 为单位拼接起来。
考虑将若干个长度相同的循环还原为 \(q\) 中的循环,我们知道的是,对于 \(q\) 中的原循环,将边连向 \(2^k\bmod len\) 之后的点得到了若干个长度相同的循环,那么对于这些长度相同的循环,我们在每个循环中先取一个,然后接下来才需要取同一循环的元素。
设 \(p\) 中一个循环的长度为 \(m\),总共 \(n\) 个循环,一种简单的构造方式令 \(p\) 中第 \(i\) 个循环的第 \(j\) 个元素,占用第 \(((\frac{jk}{n})\bmod m)*n+i\) 个位置,那么显然在原来 \(q\) 的循环中,\(p\) 中每一个循环的元素到下一个元素的距离为 \(k\)。
G
考虑暴力怎么做,拿一个可重集维护所有颜色的答案,修改一个点时,暴力修改和这个点连接的所有颜色的,将它们从集合中删除或者加入。
这样做一次操作复杂度和度数有关,无法通过本题。
将问题进一步抽象后发现它并不是一个好做的问题——和 CSP-S2022T3 有点类似,这种一对多的指定整体修改问题并不好做。考虑利用问题抽象前的性质——树上问题。
修改一个点时受到影响的颜色可以分为路径 lca 是它和不是它,后者只有一种,可以暴力修改,对于前者可以对每一个点用 priority_queue 维护路径 lca 为它的最大权值,这样就能做到 \(O(n\log n)\)。
细节有点多:
- 从树中提出链的时候,判断度数的条件应该是
(fa==0)+cnt>2
则不为链,(fa==0)+cnt==1
则为端点 - 不合法的颜色不应该被统计进它 lca 的 priority_queue 中。
- 如果一个 lca 不合法,那么它的权值不在总的 priority_queue 中,对它某一个儿子修改时自然不应该修改总的优先队列。