高二信息竞赛,第一篇

额,是一些 oi 题目。没有什么陆游的《书愤》。

难度说明

分为 noip -, noip, noip +。为了方便理解,举例说明:noip2023 :A 为 noip -,B D 为 noip,C 为 noip +;noip2022:A 为 noip -,B C D 为 noip +。洛谷:黑紫题为 noip +,蓝绿为 noip。(这是很主观的评价)

正文

1. Restricted Digits

难度评价:noip +

分治,dp。

将余数和位数为条件,一般的 dp 容易推导。进而考虑到每一步转换方式一样,故可以矩阵优化。

然而正解考虑到使用矩阵乘法时过多进行无用的运算(因为直接转移是 B 2 B^2 B2 的),故使用二进制拆位(其实快速幂可以归类于此)。

具体地,递推(倍增)计算 n = 2 k n=2^k n=2k 的所有结果,再将 N N N 拆成若干 2 k 2^k 2k 合并结果。

可以使用此类方法的情况,我认为具有以下特点:转移有结合律,转移方法恒定,转移独立,直接转移效率较高。

Record

2. Distinct Numbers

难度:noip

博弈论

有如下的结论:在公平游戏中,如果甲状态可以到达的某种状态乙,对乙能到达的所有状态丙,甲均可直接到达,则甲必胜。证明:假设甲必败,则甲能转移到的所有状态均为必胜,包括状态乙,但是必胜状态必然能转移到至少一个必败态,故不成立,甲必胜。

对于此题,我们可以发现,若 a n > a n − 1 + 1 a_n>a_{n-1}+1 an>an1+1,则有上述情况,先手必胜。若 a n = a n − 1 + 1 a_n=a_{n-1}+1 an=an1+1,为了不转移到必胜态,故双方均尽量保持 a n = a n − 1 + 1 a_n=a_{n-1}+1 an=an1+1。所以每次消去一个 a n a_n an 前的空位,看奇偶即可。

Record

3. [ABC282D] Make Bipartite 2

难度评价:noip -

一开始题目理解的是“最多连上多少条边后仍为二分图”,但实际上正确的解读是“有多少条边,在只连上仅此一边后仍为二分图”,这导致我查不出错且找不到突破 O ( n 2 / ω ) \mathcal{O(n^2/\omega)} O(n2/ω) 的算法(bitset 背包实现)。吐槽:显然是样例太弱了,没有不连通的情况 (#`-_ゝ-)

如果正确理解题意就很简单了,直接把每个连通块内同色相连的边数减去即可。

4. [ARC064F] Rotated Palindromes

难度评价:noip

思维题。

第一个考虑:当 S 1 S_1 S1 移动 k 1 k_1 k1 位, S 2 S_2 S2 移动 k 2 k_2 k2 位, S 1 ′ = S 2 ′ S_1'=S_2' S1=S2,必然有 S 1 ∼ S 2 S_1\sim S_2 S1S2(同构)。进而想到 k 1 ≠ k 2 k_1\neq k_2 k1=k2 S 1 , S 2 S_1,S_2 S1,S2 有类周期性,即是由一个部分重复构成的。而且容易发现这个部分也是回文的。那么我们的答案统计可以是形如 ∑ x ∣ n g ( x ) \sum_{x\mid n}{g(x)} xng(x),其中 x x x 表示的是最小部分的长度。

第二个考虑:关于 g ( x ) g(x) g(x),瞪眼发现 g ( x ) = x f ( x ) g(x)=xf(x) g(x)=xf(x) f ( x ) f(x) f(x) 表示这个最小回文片段有多少种,乘上 x x x 意思是可以以这个片段的任何一个字符开始。

关于 f ( x ) f(x) f(x) 怎么求,似乎不难想到是 k ⌊ x / 2 ⌋ − ∑ i ∣ x , i ≠ x f ( i ) k^{\lfloor x/2\rfloor}-\sum_{i\mid x,i\neq x}{f(i)} kx/2ix,i=xf(i)。但是我们发现这有问题。当 x x x 为偶数时,由于不存在中央字符,所以左右两部分互换是一个新的回文,而且可以通过平移原先的得到,所以这里 f ( x ) f(x) f(x) 还要除以二。

Record

5. [ABC193E] Oversleeping

难度评价:noip

数论

很好的复习,揭露我对数论的力量的一无所知。

扩展欧几里得

最基本的,我们知道辗转相除法可以求 gcd ⁡ \gcd gcd,具体地, gcd ⁡ ( a , b ) = gcd ⁡ ( b , a % b ) \gcd(a,b)=\gcd(b,a\%b) gcd(a,b)=gcd(b,a%b) 然后我们又知道: ∀ a , b , ∃ x , y ;    a x + b y = gcd ⁡ ( a , b ) \forall a,b,\exist x,y;\;ax+by=\gcd(a,b) a,b,x,y;ax+by=gcd(a,b) 但是在这里我们发现,可以有如下结论: ∃ x , y ;    a x + b y = k gcd ⁡ ( a , b )    k ∈ Z \exist x,y;\;ax+by=k\gcd(a,b)\;k\in\Z x,y;ax+by=kgcd(a,b)kZ 这是显然成立的,但是我们需要注意的是,以下命题必然不成立: ∃ x , y ;    a x + b y = p , gcd ⁡ ( a , b ) ∤ p \exist x,y;\;ax+by=p,\gcd(a,b)\nmid p x,y;ax+by=p,gcd(a,b)p 可以从 x , y x,y x,y 是整数这个角度考虑。这对我们求解不定方程 a x + b y = m ax+by=m ax+by=m 有一定的启发,以下,我们对此深入研究。

根据以上的推理,我们可以判断此方程有无解,进而我们先考虑最基本的有解情形,即 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b),通过辗转相除法,我们可以递归求 gcd ⁡ \gcd gcd,这一过程的最后一步为 b ′ = 0 , a ′ x ′ + b ′ y ′ = gcd ⁡ ( a , b ) = a ′ b'=0,a'x'+b'y'=\gcd(a,b)=a' b=0,ax+by=gcd(a,b)=a,此时我们只要令 x = 1 , y = 0 x=1,y=0 x=1,y=0,即可得一解,然后向上回溯: { x ← y ′ y ← x ′ − ⌊ a / b ⌋ y ′ \begin{cases}x\gets y'\\y\gets x'-\lfloor a/b\rfloor y' \end{cases} {xyyxa/by 最终可得一组特解 x 0 , y 0 x_0,y_0 x0,y0,对其推广到通解(令 d = gcd ⁡ ( a , b ) d=\gcd(a,b) d=gcd(a,b)): { x = x 0 + k b / d y = y 0 − k a / d \begin{cases}x=x_0+kb/d\\y=y_0-ka/d\end{cases} {x=x0+kb/dy=y0ka/d 简单的说明:改变的单位为 b / d , − a / d b/d,-a/d b/d,a/d,只能同比减小才能使等式成立,但是 b / d ⊥ − a / b b/d\perp -a/b b/da/b,故不可能同比减小而仍为整数。

对于更为一般的情况,我们设 a x + b y = m = t d , t ∈ Z ax+by=m=td,t\in\Z ax+by=m=td,tZ。此时有一组特解为 t x 0 , t y 0 tx_0,ty_0 tx0,ty0,推广至通解时出现问题,即我们改变的单位是 t b / d , − t a / d tb/d,-ta/d tb/d,ta/d 还是 b / d , − a / d b/d,-a/d b/d,a/d?答案是后者,因为从特解转为通解,其实我们做的是让两通解的变化能够相互抵消,以此考虑,通解的情况即和 t t t 无关。

以上,是我借由此题对扩欧的复习,再针对本体,数据范围提醒我们可以枚举 q ∈ [ 0 , Q ) , y ∈ [ 0 , Y ) q\in[0,Q),y\in[0,Y) q[0,Q),y[0,Y) 表示具体到站和睡醒的时间,也可以合并,单独枚举一个可能的时间(后者时间更优,但是对于此题的数据没有必要性)。其余的内容已在上面提过了。

Record

6. P5123 [USACO18DEC] Cowpatibility G

难度评价:noip

计数(技术)题,我还能说什么呢?

其实我对难度评价有疑问,因为这题说到根本就是 STL 的运用,因为可以什么 bitset 暴力通过。

总之,还是值得思考的。做法是容斥。简述思路(胡扯):对于牛 i i i,考察所有牛 j    ( j < i ) j\;(j<i) j(j<i) 中有多少与之有交集,然后很暴力地,枚举重复的是哪些冰激凌,可以容斥去重。接下去你要知道有多少之前的与之重复,是查询,需要数据结构维护,这里用 map。因为考察的方法是相同性,所以在之前枚举的时候不仅及答案,还算贡献。不知道为什么没想到直接就能算出贡献,感觉没转过弯来。

然后是喜闻乐见的卡常,可以用结构体存状态,用 vector 就等着 TLE 吧。(虽然吸氧可过)

后记,要不这题难度降为 noip - 吧,实在没什么难的,做不出的(包括我)都是 Authentic Vegetable Dog。

7. P3008 [USACO11JAN] Roads and Planes G

难度评价:noip

图论:topo排序套dijkstra

想到了写不来。dijk是跑道路连通块内的最短路,但是可以是任何起点,一开始不知道怎么搞,后来学会了,发现事先全扔到优先队列里就可以了,说明其正确性:相当于有一个超级源点,连上了所有点,然后超级源点遍历完了所有边。然后topo排序就很简单了,照样跑,遇到一个道路连通块就去跑dijk。复杂度是 O ( n + m log ⁡ n ) \mathcal{O(n+m\log n)} O(n+mlogn)

Rec

8. P4688 [Ynoi2016] 掉进兔子洞

难度评价:noip +

喜欢由乃,喜欢 ynoi,喜欢数据结构,但是菜。

可以说是把 bitset 用到了极致。

我们要求的,是三个区间中同时出现的数一个一个删掉后,最后三个区间剩下的数的个数和。简单来说,就是三个区间的长度减去同时出现的数的个数。同时出现的数的个数,即对于所有数字,在这三个区间内出现次数的 min ⁡ \min min 的和(或者说是这些个区间权值数组的最小值,又或者是三个可重集的交集大小)。

我们知道 bitset 可以简单求出集合的交并,但是对可重集的处理,我们尚不知晓。假如我们给所有数离散化编号,那么只能去掉原来在相同位置的数。如果我们能使这个编号跟只区间中出现的位置(或次数)有关,就可以去掉了。因而,我们想到,针对一个数字 x x x,如果一个区间 x x x 出现了 c c c 次,那么我们使 bitset 1 ∼ c 1\sim c 1c 位为 1 1 1 其余为 0 0 0,然后取各区间的交集(& 运算),再 popcount 即可。其实对于所有的数字也一样,我们只要给一个数字划分出一个在 bitset 内的区间就可以了,如 x x x 出现了 c c c 次,就使 a x + 1 ∼ a x + c a_x + 1\sim a_x + c ax+1ax+c 1 1 1。所以最后的问题是确定 a x a_x ax,一种方法是可以在离散化的时候记为比 x x x 小的数字个数。

总得来说,我们先离散化,使 a i ′ a_i' ai 为原来 a a a 中小于 a i a_i ai 的数的个数。然后处理题目中的所有区间,用莫队,求出一个区间对应的 bitset,其形式如下:假如 a i a_i ai 出现了 c c c 次,那么使 a i ′ a_i' ai a i ′ + c − 1 a_i'+c-1 ai+c1 的位为 1 1 1。然后对一个询问中的三个区间的 bitset 取与和,记为 p p p,再经过计算 ∑ { r i − l i + 1 − p }    ( i ∈ { 1 , 2 , 3 } ) \sum\left\{r_i-l_i+1-p\right\}\;(i\in\left\{1,2,3\right\}) {rili+1p}(i{1,2,3}) 得到答案。

Rec

9. CF1955G GCD on a grid

难度:noip

dp,整除

首先想到可以分解因数,一条路径上最大的公共·因数即为答案。然后想到一个数 x x x 的因数数量最多为 2 x 2\sqrt x 2x ,所以我们直接把一个数的因数全部列出来,然后考虑套入 dp: f ( i , j ) = F ( f ( i − 1 , j ) , f ( i , j − 1 ) ) f(i,j)=F(f(i-1,j),f(i,j-1)) f(i,j)=F(f(i1,j),f(i,j1)),我们先将因数排序,然后双指针,对于 i , j i,j i,j 上的一个因数,找到 i − 1 , j i-1,j i1,j i , j − 1 i,j-1 i,j1 中有无相同因数,然后转移。总复杂度 ∑ n m a log ⁡ ( a ) \mathcal{\sum nm\sqrt a\log(\sqrt a)} nma log(a )

Rec

10. P6846 [CEOI2019] Amusement Park

难度评价:noip +

容斥,DAG,置换群

我认为以下发现(虽然看似小学题)属于置换群:若对 x x x 条边执行反转成立,则对另外 m − x m-x mx 条边反转(得到反图)也成立。(两者关系是一种置换。)由此发现,我们对于每种成立的图记上 m / 2 m/2 m/2 的权值就可以了。

发现合法的图是 DAG,这里学习了一种新的构造 DAG 的方法:分层构造。其逻辑为:有一 DAG,我们增加一系列点到图中,这些点满足两个条件:一、入度为 0 0 0;二、满足一后可以任意连有向边(从新点到旧点)。那么我们还是得到一个 DAG。而且这样的构造可以遍历所有可能的 DAG,说明如下:考虑反过程,即每次删除入度为 0 0 0 的点及与其相连的边。

然后你就愉快地运用上述性质进行 DP 来构造 DAG。但是你发现以下两点:一、你每次新加入的点集必然是一个独立集(为保证入度为 0 0 0);二、会有重复。后者产生的原因是我们可能将一次操作的独立集又用多次操作独立集的并得到相同结果,所以对此容斥去重。

我认为这题的难点在于:一、构造 DAG 的方法;二、置换群(小学思维题)处理权值。

Rc

11.P5697 [CEOI2018] toy

此题复杂度计算仍未解决,由于其中涉及第二类斯特林数的求和。

12.P5369 [PKUSC2018] 最大前缀和

难度:noip

dp 的状态设计应当是纯函数,如果是单纯的想法,认为(设 P = ∑ i = x y a i P=\sum_{i=x}^y{a_i} P=i=xyai 为最大前缀和) f ( s t ) f(st) f(st) 表示 ∀ k ≤ y − 1 , ∑ i = 1 k a i < P \forall k\le y-1,\sum_{i=1}^k{a_i}<P ky1,i=1kai<P 不是好的状态,因此改看后缀(和 0 0 0 的大小关系)。同时这里虽然要考虑很多区间同时满足要求,但是状态转移不应分治,一个个转更快,这启示是分治一般用于有对称性的条件。

Rc

13. P1561 [USACO12JAN] Mountain Climbing S

难度:?

贪心,有点靠直观:先是 U i < D i U_i<D_i Ui<Di,按 U i U_i Ui 升序排;然后 U i = D i U_i=D_i Ui=Di,顺序无要求;最后 U i > D i U_i>D_i Ui>Di,按 D i D_i Di 降序排。纯代数证明暂没看到,但我认为可以做,只是分类讨论很复杂。后来又看到做法,是根据 皇后游戏 体面中的式子推的,但是没有让我满意的证明。大都差强人意。我给出一个可能也不太好的解释:关于为何 c i = max ⁡ { c i − 2 + b i − 1 + b i ∑ j = 1 i − 2 a j + a i − 1 + b i − 1 + b i ∑ j = 1 i − 2 a j + a i − 1 + a i + b i < c i ′ = max ⁡ { c i − 2 + b i − 1 + b i ∑ j = 1 i − 2 a j + a i + b i + b i − 1 ∑ j = 1 i − 2 a j + a i + a i − 1 + b i − 1 c_i=\max\left\{ \begin{aligned} & c_{i-2}+b_{i-1}+b_i \\ & \sum_{j=1}^{i-2}a_j+a_{i-1}+b_{i-1}+b_i \\ & \sum_{j=1}^{i-2}a_j+a_{i-1}+a_i+b_i \end{aligned} \right. < c_i'=\max\left\{ \begin{aligned} & c_{i-2}+b_{i-1}+b_i \\ & \sum_{j=1}^{i-2}a_j+a_{i}+b_{i}+b_{i-1} \\ & \sum_{j=1}^{i-2}a_j+a_{i}+a_{i-1}+b_{i-1} \end{aligned} \right. ci=max ci2+bi1+bij=1i2aj+ai1+bi1+bij=1i2aj+ai1+ai+bi<ci=max ci2+bi1+bij=1i2aj+ai+bi+bi1j=1i2aj+ai+ai1+bi1 c i − 2 + b i − 1 + b i c_{i-2}+b_{i-1}+b_i ci2+bi1+bi 可消去。只比较后两项是上式的充分非必要条件,然而只比较后两项必然可以得到一个解,所以不必充要。最后得到的式子是 i < j ⇔ min ⁡ ( a j , b i ) < min ⁡ ( b j , a i ) i<j\Leftrightarrow\min(a_j,b_i)<\min(b_j,a_i) i<jmin(aj,bi)<min(bj,ai)

然后你想着以此排序,但是这不是 严格弱序,所以你要么分类讨论,拆开分别排序,要么对 min ⁡ ( a j , b i ) = min ⁡ ( b j , a i ) \min(a_j,b_i)=\min(b_j,a_i) min(aj,bi)=min(bj,ai) 特判。这里我认为具体怎么判不重要,只要能严格判断即可。

rec

14. at_abc361_f F - x = a^b

难度:noip

这个讨论 里给别人讲了一下。

rec

15. at_abc361_g Go Territory

难度:noip

grid 很大,不可能直接存,所以我们需要对每行存线段。比如这里就存被石头分开的线段。然后把所有在两行间相连的线段用 dsu 连接,最后查 ( − 1 , − 1 ) (-1,-1) (1,1) 所在的线段所在的并查集内的线段总大小。

不是很难,只要知道第一步就能想了。但是这里需要注意,如果行数(列数)更大,我们只好用 map<int, vector<int> > 存,然后查询就是查一个长方形的区块内的里外,但写起来很麻烦,所以这题我直接把空的行上加上极大线段。

rec

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值