Codeforces Round 943 (Div. 3)(C-G)

C#

题意:对于 i[2,n],给定 xi=aimodai1,构造一种符合条件的 a1ai109

分析 aiai1 的大小关系。

  • xi<aiai1<ai

  • xi=aiai1>ai

为了不越界,aiai1 都要尽可能大。

于是可以从 n 往前构造。

  • an=109
  • xi<aiai1=aixi
  • xi=aiai1=109

submission

D#

最后一定是停在某个点不动,枚举最后停留的点即可。

submission

E#

(i,j) 表示第 i 行第 j 列。

  • j=1j=2,填 (1,j)

  • 否则填 (j,j)

这样 2n2 种长度都有了,从结论反推正确性很简单。

submission

F#

题意:给定序列 a,每次询问一对 [l,r] 是否能划分成大于 1 段使得各段异或值相等。

区间问题先转化为前缀异或。

  1. srsl1=0

    题目保证了 l<r,所以一定有解。

  2. srsl1=v

    • 一定划分为奇数段。

    • 如果能划分成奇数段,则一定能划分成 3 段。

    • 最终划分的异或值一定是 v

    于是问题转变为是否能把 [l,r] 分成三段,使得每段异或值都为 v

    找到最大的 i<r 使得 srsi=v,如果找不到则无解。

    找到最大的 j<i 使得 sisj=v,如果找不到或 j<l1 则无解。

    具体实现可以维护一个 map<int, vector<int>>

submission

G1#

题意:将字符串 s 划分成 k 段,问每段的最长公共前缀(LCP)。

如果存在划分使得 LCPv ,则任意 v<v 都存在划分。

单调性存在,二分前缀长度。

令前缀字符串为 ts 种最多有 x 个不相交的子串 t

如果 xk,则存在划分使得 LCPt

可以用 kmp 或字符串哈希求出 x

submission

G2#

题意:将字符串 s 划分成 k 段,问每段的 LCP,求出 LkR 的每个答案。

k 越大,答案 l 越小,最终的答案序列单调不增。

根号分治。

kn 时,用 G1 的方法暴力计算。

kn 时,ln

对于每个前缀 ln 分别计算出答案 x

x 能划分出 l,则 x<x 也能划分出 l,最后对答案取个后缀 max 即可。

实测 O(nnlogn) 的复杂度还是很吃紧,可以加记忆化剪枝。

submission

posted @   Lu_xZ  阅读(331)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示