【做题笔记】CF 1400-1600 构造题
本人比较菜,所以做的 rating 很低/kk/kk/kk
欢迎各位大佬嘲讽这个蒟蒻/kk/kk/kk/kk
update in 2023.10.13 哇酷真成废物了,这个题单被 Biuld 和 Million 薄纱了。
$ * $ 表示看了题解才过的(所以你会发现这里的大部分题后面都会有 $ * $)
实时通过率直接贴在后面
当不看题解通过率稳定在 \(50\%\) 以上就弃坑。希望早日弃坑
ABBC or BACB*
题面中给了两种操作 \(AB->BC\),\(BA->CB\)。我们发现这两种操作的本质就是将在左边的 \(B\) 换到 右边,在右边的 \(B\) 换到左边,并且消掉一个 \(A\)。
因此一个 \(B\) 能消掉一串连续的 \(A\)。我们考虑统计 \(B\) 的个数 \(x\) 和 \(A\) 连续的串的个数 \(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]\),并考虑让其他数的正负性都跟它一样,这需要 \(n-1\) 次操作。当都是正数或者负数的时候可以直接线性推一下,这依旧需要 \(n-1\) 操作。
AC: 1/4=\(25\%\)
Row Major*
我们考虑隔多少位才能填一个相同的数。令这个数为 \(x\),那么显然 \(x\) 不能为 \(n\) 的因数。又因为要求求出最少不同的字符数量,所以 \(x\) 越小越好,也就是等于 \(n\) 最小的非因数即可。
AC: \(1/5=20\%\)
No Prime Differences
如果 \(m\) 为合数,那么直接从左往右,从上往下顺序填数即可,这样每两行之间差为 \(m\),是合数。如果是质数的话,我们考虑每两行之间为 \(kx\;(k\ne 1)\) 的差即可。就可以先填偶数行 $[2k,2k+m-1],再填奇数行 $[2k+1,2k+m],如果 \(n\) 为奇数的话中间靠一个 \([1,m]\) 连起来。
AC: \(2/6=33.3\%\)
Bracket Coloring*
如果整个序列的 (
和 )
的个数不相等,那么显然是无解的。否则看看能不能给整个序列都染一个色,不行的话答案必定是两个色。稍微证明一下:
令最后需要 \(k\) 个颜色才能覆盖整个序列,那么显然所有满足条件 \(1\) 的序列可以合并起来,所有满足条件 \(2\) 的序列也可以合并起来,最后得出 \(k=2\)。
令 (
值为 \(1\),)
值为 \(-1\),\(sum[i]\) 表示序列值的前缀和。我们将它在函数上表示出来,会发现每当函数的正负性变化的时候,现在的颜色肯定和上一个颜色要不一样。所以求出函数与 \(x\) 轴的交点即可,不难发现交点满足 \(sum[i]=0,sum[i-1]=-1\) 或 \(sum[i-1]=0,sum[i]=-1\)。
AC: \(2/7=28.5\%\)
Flipper
第一位是一定不可能再在第一位了,所以新的第一位应该是除第一位外的最大的,令它的下标为 \(x\),那么有两种可能
- x 为末尾,可以把 \([1,x-1]\) 的移到后面去
- 翻转 \([i,x-1]\) 这段区间,\(x\) 作为后缀的开头成为新的开头
对于可能一,可以判一下 \(x\) 是否为末尾,并且 \(a[1]>a[x-1]\) 就直接翻转 \([n,n]\) 这段区间。
对于可能二,我们发现最后的序列是 \([x,n][x-1,i][1,i-1]\),贪心的让 \(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*
我以为是找规律,实际上是搜索。一个显然但又不是那么显然的结论就是最后边长为 \(F_n\) 和 \(F_{n+1}\) 分割成的正方形边长分别是 \(F_0,F_1,...,F_{n-1},F_n\)。
因此,就可以从大到小判断能不能放这个正方形。
AC:\(4/10=40\%\)
Sum on Subarrays*
最近发现很多题都是想到一半有个想不出就不会了。
可以先二分找到最小的 \(x\) 且 \(\frac{x(x+1)}{2}\le k\)。如果是等于的直接前面 \(x\) 个是 \(1\),后面的都是 \(-1000\)。否则可以前 \(x-1\) 个都是 \(32\),第 \(x\) 个是 \(-1-32(x-(k-\frac{x(x-1)}{2})-1)\)。这是因为前 \(x-1\) 个已经产生了 \(\frac{x(x-1)}{2}\) 个子串,最后一个需要额外产生 \(k-\frac{x(x-1)}{2}\) 个子串。所以它要与前面 \(x-(k-\frac{x(x-1)}{2})-1\) 个后缀的和是负数。
AC:\(4/11=36.3\%\)
Sequence Master
首先,我们发现由于 \(2\) 的特殊性,所以在 \(n=2\) 时 \(2,2.2,2\) 也是一种合法序列。
接着我们考虑 \(n\) 是偶数的情况,这时候如果序列中有 \(2n-1\) 个 \(-1\) 和一个 \(n\) 也是合法的,比较容易证明。但如果 \(n\) 是奇数,序列中有 \(2n-1\) 个 \(-1\) 和一个 \(n-2\) 是不合法的。这是由于如果 \(n-2\) 放在乘法集合里面,这个集合的值是 \((-1)^{n-1}(n-2)=n-2\),而另一个集合的值应该是 \(-n\),除非 \(n=1\) 否则等式不成立。
最后对于所有情况,我们发现显然 \(0,0,....,0\) 是一组合法的解。由于这样合法的解并不多,我们直接暴力枚举每一种可能即可。
AC:\(5/12=41.6\%\)
The Very Beautiful Blanket*
神秘的构造题
观察样例可以稍微猜测一下每个正方形里的值都差 \(1\)。设左上角的坐标为 \((i,j)\) 并且值为 \(i^j\),那么这个 \(2\times 2\) 的方格异或起来应该是 \(i\oplus j\oplus i\oplus (j+1)\oplus (i+1)\oplus j\oplus (i+1)\oplus (j+1)=0\)。现在我们只需要让每个值都尽可能不同即可,这个只需要给 \(i\) 乘上 \(2^9=512\)。
AC:\(5/13=38.4\%\)
Unforgivable Curse (easy version)
首先可以判断一下s和t中的字符数量和种类是不是都相等,然后大胆假设如果 \(x\) 能动,那么是不是x就可以交换到任意位置了呢?
相差 \(1\) 的位置可以先交换 \(3\),再交换 \(2\)。剩下的证明 \(x\) 可以由若干个 \(2,3\) 相加得来。令 \(tmp=x/2\),那么可以先丢 \(tmp-1\) 个 \(2\),剩下要么还差 \(2\),要么差 \(3\),显然是可行的。所以可以得证。
因此当 \(n\ge 6\) 的时候是一定有解的,因为此时无论是哪个位置都可以动。特判一下 \(n\le 5\) 的情况即可。
AC:\(6/14=42.8\%\)
Unforgivable Curse (hard version)
写完简单版本其实这题也不难。依旧证明 \(x\) 可以由若干个 \(k,k+1\) 相加得来。令 \(tmp=x/k\),就先放 \(tmp-1\) 个 $$k,剩下的应该是 \([k,2k-1]\),也就是证明 \([1,k-1]\) 可以移动出来。
因为 \(1\) 是可以移出来的,任意数都只要移出若干个 \(1\) 即可。所以这个结论是成立的。因此当 \(n\ge 2k\) 一定有解,剩下的特判即可。
AC:\(7/15=46.6\%\)
Heavy Intervals
好像中间有几题写了没贴上来?无所谓不管了
感觉很 CF 题,是很多套路的集大成题。
有个比较显然的结论,已知 \(s_1<s_2,c_1<c_2\),那么 \(s_1c_2+s_2c_2<s_1c_1+s_2c_2\),随便证证就出来了。所以有个贪心策略,让大的 \(c\) 匹配小的 \(r_i-l_i\)。于是 \(r_i-l_i\) 也要有尽可能小的,并且小的要尽可能多,就将 \(l,r\) 从小到大排序,枚举 \(l\),在 \(r\) 中间二分找到第一个大于它并且没有被访问到的数。直接弄会超时,用 CF 经典套路并查集优化一下查找过程即可。
AC:\(8/16=50\%\)