Codeforces Round #814 (Div. 1)
A Burenka and Traditions
首先可以发现可以只执行区间长度为 1 或者区间长度为 2 的操作。如果全部用长度为 1 的操作,需要操作 n 次,而对一个异或和为 0 的区间,可以
每次操作相邻的两个数,这样会少 1 次操作次数。于是只需要去找异或和为 0 的区间,用 set 记录前缀异或和并支持查询即可。
B Fibonacci Strings
首先根据所有数的总和确定需要分前多少个 fib 数,然后贪心,从大到小依次考虑每个 fib 数,每次取出剩下的数中的最大值,如果是上次操作的
则取次大值,如果这个数小于需要操作的 fib 数则无解,否则将它减去当前的 fib 数再放回去。
这是因为如果剩下的某个数大于现在需要分的 fib 数,那么要把它分解成若干不相邻的 fib 项之和,这个分解方法里面是一定包含当前的这个 fib 数的,所以这一步一定要分出去,否则后面就分不完了。
C Tonya and Burenka-179
如果对 nn 的每一个约数 dd 都维护所有大小为 dd 的环的数字总和的话,时间复杂度是 O(nd(n)logn)O(nd(n)logn) ,过不去。想一下可以发现如果
两个约数 d1,d2d1,d2 满足 d1d1 是 d2d2 的约数,那么只用维护大小为 d1d1 的环的信息即可,时间复杂度 O(nω(n)logn)O(nω(n)logn) 。
D Permutation for Burenka
首先根据序列 pp 建出笛卡尔树,就等价于在树上填数,使得 axax 大于 xx 子树中的其他任意一个点的 aa 。
在填数时,只需要考虑初始已经存在的数对当前位置的大小限制,因为后面填的数可以通过交换来满足彼此之间的大小关系,于是可以对每个需要填的位置处理出 [li,ri][li,ri] 表示这个位置能填的数的区间。
那么问题转化为给出 kk 个区间,需要验证 SS 中的 k−1k−1 个数以及 dd 能否与这些区间形成一个合法的匹配。先不考虑 dd ,尝试匹配 SS 中的 k−1k−1 个数。将这些数从小到大排序,将 kk 个区间按照左端点排序,依次考虑每个数,并且将所有左端点 ≤≤ 当前数的区间加到一个 multiset 中,每次在 multiset 中查询出右端点 ≥≥ 当前数的最小右端点的区间,将其与当前的数匹配。
记第 ii 个点匹配到的区间为 seg(i)seg(i) ,最后会剩下一个区间没有匹配到,记作 seg(k)seg(k) 。记 dp(i)dp(i) 表示去掉第 ii 个区间后,剩下的 i−1i−1 个区间是否能与 SS 中的 k−1k−1 个数形成合法匹配。初始有 dp(seg(k))=1dp(seg(k))=1 ,再从 k−1k−1 开始,从大到小枚举 ii ,记 nxt(i)nxt(i) 表示如果去掉 seg(i)seg(i) ,第 ii 个点会匹配到的区间,这个可以在计算 seg(i)seg(i) 时一并求出。那么如果 nxt(i)nxt(i) 存在,就有 dp(seg(i))=dp(nxt(i))dp(seg(i))=dp(nxt(i)) ,否则 dp(seg(i))=0dp(seg(i))=0 。最后所有 dpdp 值为 11 的区间形成的并就是合法的 dd 的所有取值。由于第 ii 个点既能匹配 seg(i)seg(i) ,又能匹配 nxt(i)nxt(i) ,所以这两个区间一定是相交的,那么最后所有 dpdp 值为 11 的区间并起来一定还是一个区间,记录这个区间的左右端点即可。没有注意到这个性质的话,也可以直接通过打差分标记求出这些区间的并。时间复杂度 O(nlogn)O(nlogn) 。
E Impressionism
将所有行看成 nn 个点,将所有列看称 mm 个点,对于每个 ai,jai,j ,将行 ii 与列 jj 之间连一条边,颜色为 ai,jai,j ,那么问题就转化为了判断两张二分图是否同构。
由于两条颜色相同的边不会有公共点,所以对于一个连通块,只需要完成了一个点的配对,就可以沿着边将所有点的配对情况都依次确定。最后根据配对的情况分别对行与列构造一个交换顺序即可。
F Burenka, an Array and Queries
先莫比乌斯反演一下,可知要求的是 ∑d|pμ(d)⋅⌊Cd⌋∑d|pμ(d)⋅⌊Cd⌋ 。这个值只和区间 [l,r][l,r] 中所有数含有的质因子有关,可以通过莫队求出每次询问时区间内含有的所有质因子。
现在考虑已知了区间内含有的所有质因子,如何求出答案。注意计算时只会用到没有重复质因子并且 ≤C≤C 的 dd ,而 43×47×53=107113>10543×47×53=107113>105 ,于是可以将 2×1042×104 内的所有质数分为 <43<43 的小质数(共 1313 个),与 ≥43≥43 的大质数(共 22492249 个),那么有用的 dd 所包含的质因子一定是由所有小质数的一个子集与不超过 22 个大质数组成的。于是还要找出乘积不超过 105105 的大质数对(共 49044904 个)。
预处理出 f(S)f(S) 表示选取的小质数为 SS 的各个子集的答案之和,g(S,x)g(S,x) 表示选取的小质数为 SS 的各个子集,选取的大质数为 xx 的答案之和,h(S,x,y)h(S,x,y) 表示选取的小质数为 SS 的各个子集,选取的大质数为 xx 与 yy 的答案之和,回答询问时枚举选取的大质数或大质数对即可求出答案。时间复杂度为 O(n√n+qk)O(n√n+qk) ,其中 kk 为合法的大质数与大质数对的数目之和,在本题的数据范围下为 71537153 。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步