do_while_true

一言(ヒトコト)

CCPC 2023 Guilin Onsite (部分)解题报告

A Easy Diameter Problem

不断删端点的时候直径中点每次只会移动 \(1/2\) 的距离(可以在一条边的中间),假如从 \(u\) 移动到 \(v\)\(d\)\(d-1/2\),距离 \(u\)\(d\) 的点集为 \(S\),距离 \(v\)\(d-1/2\) 的点集为 \(T\),那么 \(S-T\) 是一定要删掉的,而 \(S\cap T\) 可以和 \(S-T\) 差不多时间删掉,也可以留到后面删,于是可以等它必须要删掉的时候再考虑插入到删除序列里,那么 dp 状态里就多加一维当前可以任意插入的后缀的长度,然后具体讨论形式可以直接看官方题解。

实现上的细节是,由于这个点可能在中间,但是可以根据删剩下的直径长度 \(d\) 的奇偶直接确定直径中点是边还是点,于是 dp 状态的第一维可以记边的编号 \(p\),表示当前中点是 \(u_p\),上一个中点是 \(v_p\)。时间复杂度是 \(\mathcal{O}(n^3)\) 是因为复杂度和边界点总个数有关,而对于某个 \(d\) 对边界点个数求和是 \(\mathcal{O}(n)\) 的。

Code

B The Game

从小到大排序之后,应当是 \(A\) 的后 \(m\) 个对应到 \(B\) 的后 \(m\) 个,记录 \(A\) 的后 \(m\) 个的总大小 \(sa\)\(B\) 的后 \(m\) 个的总大小 \(sb\),以及 \(A\)\(B\) 多出来的数的个数 \(res\)\(sb-sa=res\) 那么可以直接对应从小到大将 \(A\) 中的数依次修正为 \(B\),删的一定是前面 \(res\) 个。否则我们需要浪费次数,贪心,需要浪费时去操作 \(A\) 的最小值。

用俩 multiset 实现了一个对顶堆一样的玩意维护前 \(m\) 大。时间复杂度 \(\mathcal{O}(n\log n)\)

Code

C Master of Both IV

枚举 xor \(=x\),考虑它的真因子一定 \(\geq x/2\),无论怎么异或都搞不出 \(x\) 的最高位,所以一定有奇数个 \(x\),从而 \(x\) 的真因子 xor 和为 0。xor 为 0 的个数即为不在线性基里的元素个数,注意去重以及统计 \(x=0\) 的情况。

Code

E Prefix Mahjong

考虑怎么 check,那就是按值域 \(f_{0/1/2,0/1/2,0/1}\) 表示前前位置开头有几个顺子,前一个位置开头有几个顺子,是否已经有雀头。转移是一个矩阵乘法,那么直接在值域上线段树维护矩阵乘法。因为是 01 矩阵所以可以压位,然后值域可以离散化到 1e5,这样复杂度就是 \(\mathcal{O}(n k^2\log n)\),其中 \(k=18\)

Code

G Hard Brackets Problem

首先发现无论怎么操作,光标的右侧永远是一堆 ),只有光标右侧为空的时候才会插入一个 )。所以合法当且仅当串是若干个合法括号序列中间拼上若干 ) 构成的,分析到这里构造就很简单了。

Code

H Sweet Sugar

一个连通块合法当且仅当 \(\sum\geq k\) 且与 \(k\) 同奇偶。和这个题一样证,\(w\) 合法那么 \(w-2\) 一定合法。所以贪心一下就行了。

Code

I Barkley II

计算 cnt-mex 最大的区间。枚举 mex 是 \(x\),计算删去 mex 之后剩余的若干区间 cnt 最大是多少。这里虽然不能保证 mex 是 \(x\),首先答案一定能被统计到,其次算错的话真实 mex \(<x\),只会更劣,所以这么做是对的。

Code

J The Phantom Menace

好难写...枚举第一个串的偏移量,然后建图跑欧拉回路 \(a_i[1,d]\to a_i[d+1,m]\)\(b_j[1,m-d]\to b_j[m-d+1,m]\)。注意这里是一个二分图要区分左右部点(因为 \(d=m/2\) 的时候可能有些问题?),需要哈希,时间复杂度 \(\mathcal{O}(nm)\)

Code

posted @ 2023-11-07 18:50  do_while_true  阅读(894)  评论(1编辑  收藏  举报