【做题笔记】CF 1400-1600 构造题

本人比较菜,所以做的 rating 很低/kk/kk/kk
欢迎各位大佬嘲讽这个蒟蒻/kk/kk/kk/kk
update in 2023.10.13 哇酷真成废物了,这个题单被 Biuld 和 Million 薄纱了。

表示看了题解才过的(所以你会发现这里的大部分题后面都会有
实时通过率直接贴在后面

当不看题解通过率稳定在 50% 以上就弃坑。希望早日弃坑

ABBC or BACB*

题面中给了两种操作 AB>BCBA>CB。我们发现这两种操作的本质就是将在左边的 B 换到 右边,在右边的 B 换到左边,并且消掉一个 A

因此一个 B 能消掉一串连续的 A。我们考虑统计 B 的个数 xA 连续的串的个数 y。如果 x>y 那么显然 A 都能被消掉,否则就减去最小的一段 A 不消。

为什么是统计 B 的个数而不是连续的 B 的段数? 因为我们发现如果是这样的一个串 ABBA,这样两边的 A 也能消掉,但 B 的段数是小于 A 的段数的。

AC: 0/1=0%

Two-Colored Dominoes*

一个比较显然的结论,如果一行需要涂色的地方是奇数那么一定无解。有解的情况只需要判断 L,U 的颜色,直接依次按照 WBWBWB 的顺序涂即可。

AC: 0/2=0%

Kolya and Movie Theatre

没看题解过掉了,可喜可贺,可喜可贺(完了太菜了)

题面像 dp,但并不是。我们发现只要确定了最后一次看电影是在哪一天就知道要减多少个 d了,再贪心的用优先队列维护最多前 m 个最大的正数的和即可。

AC: 1/3=33.3%

Dual (Easy Version)*

找到绝对值最大的 a[x],并考虑让其他数的正负性都跟它一样,这需要 n1 次操作。当都是正数或者负数的时候可以直接线性推一下,这依旧需要 n1 操作。

AC: 1/4=25%

Row Major*

我们考虑隔多少位才能填一个相同的数。令这个数为 x,那么显然 x 不能为 n 的因数。又因为要求求出最少不同的字符数量,所以 x 越小越好,也就是等于 n 最小的非因数即可。

AC: 1/5=20%

No Prime Differences

如果 m 为合数,那么直接从左往右,从上往下顺序填数即可,这样每两行之间差为 m,是合数。如果是质数的话,我们考虑每两行之间为 kx(k1) 的差即可。就可以先填偶数行 [2k,2k+m1][2k+1,2k+m],如果 n 为奇数的话中间靠一个 [1,m] 连起来。

AC: 2/6=33.3%

Bracket Coloring*

如果整个序列的 () 的个数不相等,那么显然是无解的。否则看看能不能给整个序列都染一个色,不行的话答案必定是两个色。稍微证明一下:
令最后需要 k 个颜色才能覆盖整个序列,那么显然所有满足条件 1 的序列可以合并起来,所有满足条件 2 的序列也可以合并起来,最后得出 k=2
( 值为 1) 值为 1sum[i] 表示序列值的前缀和。我们将它在函数上表示出来,会发现每当函数的正负性变化的时候,现在的颜色肯定和上一个颜色要不一样。所以求出函数与 x 轴的交点即可,不难发现交点满足 sum[i]=0,sum[i1]=1sum[i1]=0,sum[i]=1

AC: 2/7=28.5%

Flipper

第一位是一定不可能再在第一位了,所以新的第一位应该是除第一位外的最大的,令它的下标为 x,那么有两种可能

  1. x 为末尾,可以把 [1,x1] 的移到后面去
  2. 翻转 [i,x1] 这段区间,x 作为后缀的开头成为新的开头
    对于可能一,可以判一下 x 是否为末尾,并且 a[1]>a[x1] 就直接翻转 [n,n] 这段区间。
    对于可能二,我们发现最后的序列是 [x,n][x1,i][1,i1],贪心的让 a[i]>a[1] 即可。也就是找到 x 左边第一个小于 a[1] 的数

AC: 3/8=37.5%

Search in Parallel

贪心的把出现次数多的放在遍历时间少的位置即可。

AC: 4/9=44.4%

Umka and a Long Flight*

我以为是找规律,实际上是搜索。一个显然但又不是那么显然的结论就是最后边长为 FnFn+1 分割成的正方形边长分别是 F0,F1,...,Fn1,Fn

因此,就可以从大到小判断能不能放这个正方形。

AC:4/10=40%

Sum on Subarrays*

最近发现很多题都是想到一半有个想不出就不会了。

可以先二分找到最小的 xx(x+1)2k。如果是等于的直接前面 x 个是 1,后面的都是 1000。否则可以前 x1 个都是 32,第 x 个是 132(x(kx(x1)2)1)。这是因为前 x1 个已经产生了 x(x1)2 个子串,最后一个需要额外产生 kx(x1)2 个子串。所以它要与前面 x(kx(x1)2)1 个后缀的和是负数。

AC:4/11=36.3%

Sequence Master

首先,我们发现由于 2 的特殊性,所以在 n=22,2.2,2 也是一种合法序列。

接着我们考虑 n 是偶数的情况,这时候如果序列中有 2n11 和一个 n 也是合法的,比较容易证明。但如果 n 是奇数,序列中有 2n11 和一个 n2 是不合法的。这是由于如果 n2 放在乘法集合里面,这个集合的值是 (1)n1(n2)=n2,而另一个集合的值应该是 n,除非 n=1 否则等式不成立。

最后对于所有情况,我们发现显然 0,0,....,0 是一组合法的解。由于这样合法的解并不多,我们直接暴力枚举每一种可能即可。

AC:5/12=41.6%

The Very Beautiful Blanket*

神秘的构造题

观察样例可以稍微猜测一下每个正方形里的值都差 1。设左上角的坐标为 (i,j) 并且值为 ij,那么这个 2×2 的方格异或起来应该是 iji(j+1)(i+1)j(i+1)(j+1)=0。现在我们只需要让每个值都尽可能不同即可,这个只需要给 i 乘上 29=512

AC:5/13=38.4%

Unforgivable Curse (easy version)

首先可以判断一下s和t中的字符数量和种类是不是都相等,然后大胆假设如果 x 能动,那么是不是x就可以交换到任意位置了呢?
相差 1 的位置可以先交换 3,再交换 2。剩下的证明 x 可以由若干个 2,3 相加得来。令 tmp=x/2,那么可以先丢 tmp12,剩下要么还差 2,要么差 3,显然是可行的。所以可以得证。

因此当 n6 的时候是一定有解的,因为此时无论是哪个位置都可以动。特判一下 n5 的情况即可。

AC:6/14=42.8%

Unforgivable Curse (hard version)

写完简单版本其实这题也不难。依旧证明 x 可以由若干个 k,k+1 相加得来。令 tmp=x/k,就先放 tmp1 个 $$k,剩下的应该是 [k,2k1],也就是证明 [1,k1] 可以移动出来。

因为 1 是可以移出来的,任意数都只要移出若干个 1 即可。所以这个结论是成立的。因此当 n2k 一定有解,剩下的特判即可。

AC:7/15=46.6%

Heavy Intervals

好像中间有几题写了没贴上来?无所谓不管了

感觉很 CF 题,是很多套路的集大成题。

有个比较显然的结论,已知 s1<s2,c1<c2,那么 s1c2+s2c2<s1c1+s2c2,随便证证就出来了。所以有个贪心策略,让大的 c 匹配小的 rili。于是 rili 也要有尽可能小的,并且小的要尽可能多,就将 l,r 从小到大排序,枚举 l,在 r 中间二分找到第一个大于它并且没有被访问到的数。直接弄会超时,用 CF 经典套路并查集优化一下查找过程即可。

AC:8/16=50%

posted @   Cloote  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示