Codeforces Round 963 (Div. 2) 题解

Codeforces Round 963 (Div. 2)

A

A, B, C, D 的数量和 n 取个 min 相加

B

只有奇数或只有偶数答案为 0,否则,只能把所有的偶数改为奇数,因为不可能把所有奇数改为偶数。

然后就是改的大小问题了。考虑找到最大的奇数,然后把偶数从小到大依次修改。

C

显然对 2k 考虑同余就好了,因为循环节长度是 2k 的。

然后变成一个长度为 2k 的数轴,求若干个区间的交集。

分成两种区间,一种是包左右两头的,一种是包中间的。

由于这两种区间的交集最多只会有两个区间,直接维护这两个区间就好了。

D

直接 dp,设 f[i][j] 表示考虑前 i 个数,保留 j 的数,最少保留几个,显然 f[n][j] = (n + 1) / 2 的最大 j 就是答案了。不难注意到这个东西第二维是单调的,考虑二分这个 j,然后去 dp。

E

假设只考虑对一列 j 进行修改的操作,可以发现相当于把 f(1),f(2),,f(n) 覆盖掉第 j 列。覆盖之后,新的 f(1),f(2),,f(n) 居然就是原来的第 j 列。

这不是相当于,把 f(1),f(2),,f(n) 看作第 0 列,然后交换第 0 和第 j 列么。

不过 g(j) 被改变了,这个操作不能这么单纯地被描述。但是一看就会发现 g(j) 变成了所有数的异或和,于是不难想到,定义第 0 行和第 0 列,a0,0 就是所有数的异或和,ai,0=f(i),a0,j=g(j),于是操作变成交换第 0 行和第 i 行或交换第 0 列和第 j 列。

推广一下,其实就是交换任意两行和任意两列,然后让差值和最小。

那就是给行决定一个排列,列决定一个排列,然后让差值和最小。这时候行、列是独立的。

当题意能简化成简单的一句话时,说明我们建立的模型很对啊!

显然可以求出第 i 行和第 j 行的差值,把这个看作边权,变成找到一个最短哈密顿路径。

这个问题我没那么熟悉,思考一下直接状压就能 O(n22n) 做完?

F

略微彰显智慧了,反射这个确实应该想到。

如果机器人不遵守边界限制,那么当其在坐标 (x,y) 且满足 x2W 的倍数,y2H 的倍数时,机器人回到了原点。

于是变成给你操作序列,统计何时满足上面的条件。

如果是 F1 的话,可以求出每次循环分别会遍历 (x,y) 几次(x,y 分别取模),然后对 k 次循环直接统计即可。

设第 i 次移动到了 (xi,yi),变成枚举 i[0,k)(ixn,iyn)(xm,ym)(mod(H,W))

反过来,考虑 (xmxn1,ymyn1)(i,i)(mod(H,W)),然后就结束了?好像也不难?细节就是考验数论功底了。

posted @   lingfunny  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示