【做题笔记】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\),那么有两种可能

  1. x 为末尾,可以把 \([1,x-1]\) 的移到后面去
  2. 翻转 \([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\%\)

posted @ 2023-10-09 22:13  Cloote  阅读(28)  评论(0编辑  收藏  举报