CF的一些题

Manthan, Codefest 19

A. XORinacci

Description

定义一个函数\(f(n)\)
\[ f(n) = \begin{cases} a & (n = 0) \\ b & (n = 1) \\ f(n - 1) \oplus f(n - 2) & (n > 1) \end{cases} \]
现在给定\(a, b, n\),你需要求出\(f(n)\)的值

\(a, b, n \leq 10^9\)

Solution

我们发现这个函数的最小循环节为\(3\),所以我们直接对于\(n \bmod 3\)分类讨论一下就可以了

B. Uniqueness

Description

给定一个长度为\(n\)的序列,你可以选择一个区间中的数字删除,你要使得剩下的数字两两不同。问最少需要删除多少个数字

\(n \leq 2000\)

Solution

我们发现删除之后需要保证每种数字最多出现一次,所以当删除区间的往右移动的时候,左端点肯定不会往左移动。所以左端点关于右端点单调,所以我们就\(two~point\)就好了,另外我们需要再开一个桶维护剩下的数字的个数

C. Magic Grid

Description

有一个\(n * n\)的矩阵,你需要把数字\(0\)\(n^2 - 1\)\(n^2\)个数字不重不漏地填入其中,你需要保证每行每列的异或值相同,请求出任意一种合法的方案

\(n \leq 1000\),并且\(n\)\(4\)的倍数

Solution

有两个关于异或的性质

  1. 对于任意自然数\(k​\),均满足\(4k \oplus 4k + 1 \oplus 4k + 2 \oplus 4k + 3 = 0​\)

  2. 对于任意自然数\(k\),均满足\(k \oplus k + 4 \oplus k + 8 \oplus k + 12 = 0\)

所以,我们就可以直接构造了,大概就像下面这个样子
\[ \begin{matrix} 0&1&2&3&32&33&34&35 \\ 4&5&6&7&36&37&38&39 \\ 8&9&10&11&40&41&42&43 \\ 12&13&14&15&44&45&46&47 \\ 16&17&18&19&48&49&50&51 \\ 20&21&22&23&52&53&54&55 \\ 24&25&26&27&56&57&58&59 \\ 28&29&30&31&60&61&62&63 \end{matrix} \]

D. Restore Permutation

Description

有一个长度为\(n\)\(1\)\(n\)的排列\(p_i\),我们定义\(s_i = \sum\limits_{j = 1}^{i - 1} [p_j < p_i] \cdot p_j\)

现在告诉你\(s_i\)序列,你需要倒推出\(p_i\)序列

\(n \leq 2 \times 10^5\)

Solution

我们可以考虑按\(p_i\)从小到大依次还原每一个数字。首先我们看当前\(s_i\)有哪些位置为\(0\),那么最后一个\(s_i\)\(0\)的位置\(pos\)就一定是当前需要还原的数字。然后把这个位置扔掉,再对区间\([pos + 1, n]\)里的每一个\(s_i\)都减去当前还原的数字

我们考虑为什么这样子做是对的,我们发现如果比一个数字要小的所有数字都被删除了,那么当前需要还原的数字显然就是这个数字了。当有多个位置的\(s_i\)\(0\)时,我们要优先考虑后面的位置。因为接下来要填的几个数字都不相同,我们要让它们互相没有影响,就只能倒序填入每一个位置

E. Let Them Slide

Description

有一个\(n\)\(w\)列的棋盘,每一行都有一个长度为\(l_i\)的滑块,滑块上的每一个位置都有一个权值\(a_{i, j}\)

现在你可以随意平移所有滑块(不能移动到别的行,也不能超出棋盘的边界),问你对于第\(\forall j \in [1, w]\)列可能出现最大的权值和为多少,询问之间是独立的

\(1 \leq n, w, \sum l_i \leq 10^6, l_i \leq w, |a_{i, j}| \leq 10^9\)

Solution

我们可以考虑每一行的滑块对每一列的贡献,我们发现对于任意一个数字能够影响到的都是一段区间,如果一个位置被多个区间包含,我们就取权值最大的。这样当前滑块对于所有列贡献不同的区间就只有\(\mathcal{O}(l_i)\)个,我们就直接把这些贡献加到答案里面就可以了

我一开始还思博了,用了一个树状数组来维护贡献,后来发现直接差分就可以了,因为它只要最后求一遍答案

在求每一个滑块对每一个区间的影响时,我是直接用\(set\)搞的,实际上可以直接用一个双端队列去搞。因为每一个数字的影响区间长度都相同

Educational Codeforces Round 71

E. XOR Guessing

Description

这是一道交互题

有一个隐藏的数字\(x\),你要通过不超过两次询问推出\(x\)的值。每次询问你可以给定一个长度恰好为\(100\)的序列,然后交互库会返回序列中随机一个位置的值异或上\(x\)的结果,任意一个数字只能在所有询问中出现一次

题目中所涉及到的所有权值均\(\in [0, 2^{14})\)

Solution

这是一道降智的题目

这道题就直接用一次询问搞出\(x\)\(7\)位的值,再用一次搞出后\(7\)位的值就没了,就是让询问的那\(100\)个数在某\(7\)位上都为\(0\)

F. Remainder Problem

Description

给你一个数列,需要支持\(q\)次下面两种操作

  1. 给位置\(x\)上的数字增加\(y\)
  2. 查询所有在模\(x\)意义下为\(y\)的位置上的值之和

\(q \leq 5 \times 10^5, TL = 4s\)

Solution

我们不要被这道题的数据范围吓倒了,实际上这道题就直接分块就可以了

我们考虑对于\(\leq \sqrt n\)的模数预处理出每一个余数的答案,在修改的时候暴力更新一下就可以了

对于\(> \sqrt n\)的模数就直接暴力遍历一遍查询即可

猜你喜欢

转载自www.cnblogs.com/xunzhen/p/11431684.html