vp 记录(new)

记录一下 vp 的题。

CF1735 div.2

时间:2022.10.4 9:40。

排名:71。

perf:*2600

题目 难度 是否做出 所用时间 备注 code
A *800 2min link
B *900 5min link
C *1400 17min link
D *1700 19min link
E *2400 81min WA*1 link
F *2900

题解(补题)

A

拆成三个位置,容易发现答案是 \(\left \lfloor\frac{n-6}{3}\right \rfloor\)

B

先把最小的 \(a_1\) 拿出来,那么相当于满足 \(a_i\le 2a_1\),直接上取整即可。

C

贪心,尽量让前面的数小,因此直接连边判环即可。

D

可以枚举中间交点是什么,然后相当于横竖乘起来即可,因此对于每个点去找有多少种方案选出两个数满足只有一位不同即可。

E

可以发现在左边,在中间,在右边这三种情况,如果一个 \(d1_i,d2_j\) 对应,那么 \(|p_1-p_2|=|d1_i-d2_j|\) 或者 \(|p_1-p_2|=d1_i+d2_j\),因此可以直接 \(O(n^2)\) 枚举所有情况,然后枚举 \(|p_1-p_2|\),这样就可以直接二分图匹配一下看看是否合法即可,但是这样复杂度 \(O(n^3)\),会寄。

结下来观察那个二分图的性质,可以发现相当于有两种边,一种是差,一种是和,那么先把大于 \(|p_1-p_2|\) 全部扔掉,剩下的乱匹配就好了,复杂度 \(O(n^2\log n)\)

CF1736 div.2

时间:2022.10.11 14:05。

排名:28。

perf:*2740

题目 难度 是否做出 所用时间 备注 code
A *800 3min link
B *1200 5min link
C1 *1300 5min RE*1 link
C2 *2400 18min 首杀! link
D *2200 54min WA*1 link
E *2600 \(\color{red}\bigstar\) link

题解(补题)

A

考虑那些不同的位置,要么每个都改,要么把个数改成一样然后排列。

B

观察样例,可以发现对于一个素数满足一个数的指数小于左右两边的就寄了,那么直接做即可。

证明也比较简单。

C1

考虑一个右端点产生的贡献,那么可以得到 \(i+1-\max_{j=1}^i (j-a_j+1)\),直接做即可。

C2

考虑上面那个式子,主要是要求后面的东西,也就是前缀最大值求和,这个直接把楼房重建的代码搬过来改一下就好了,这样也可以解决询问直接不独立的问题。

D

神秘构造题,首先考虑已知一个状态如何判断其合法,这个东西可以直接贪心匹配,但是和正解没什么关系。

先把操作换成把 \(a_{i+1}\) 移动到 \(a_i\)(其实是因为我题目看错了),这个只需要反转一下就好了。

考虑一个显然合法的情况,就是对于所有奇数 \(i\),满足 \(a_i=a_{i+1}\)

那么去考虑所有的 \(1\),可以每次把第偶数次出现的 \(1\) 移动到上一个 \(1\) 旁边,然后把 \(0\) 扔到前面去。

但是需要考虑每个相等连续段都是偶数,因此需要考虑 \(0\) 的奇偶性来判断把 \(1\) 放在左边还是右边。

举个栗子,对于 0010001001000100,操作就是 \(4,7,9,14\),那么可以得到 0011000011000000

E

赛时想法是设 \(f_{i,j}\) 表示已经取了 \(i\) 个数了,当前在 \(i\) 的数是 \(a_j\) 的最大值,然后考虑把后面的一个 \(a_k\) 移到前面来换掉 \(a_j\),但是这样写寄了,不知道为啥。

考虑设 \(f_{i,j,0/1}\) 表示已经取了 \(i-1\) 次,当前进行了 \(j\) 次交换操作,当前 \(i\) 的位置是 \(a_i\) 还是 \(0\),容易发现如果 \(i<j\) 则为不合法状态。

那么当前转移只有两种,一种是把当前 \(i\) 位置的数一直向后移动,一种是把后面的一个 \(a_k\) 先移动到 \(i\) 再移回 \(k\),但注意的是可能不需要移动到 \(k\),只需要移动到 \(k-1\),这样交换次数少一次,然后后面的移动到 \(k\),因此直接做即可。

CF1731 div.2

时间:2022.12.28 11:05。

排名:83。

perf:*2481

题目 难度 是否做出 所用时间 备注 code
A 1min link
B 7min CE*1 link
C 15min WA*2 link
D 9min TLE*1 link
E 26min link
F 49min link

题解(补题)

A

\(a+b\le 1+ab\),所以把所有数乘起来,加上 \(n-1\) 即可。

B

沿着对角线走最优,相当于 \(\sum i^2+\sum i\times (i+1)\)

C

考虑那些数不是 good 的,完全平方数,只有 \(\sqrt{n}\) 种,对于每个暴力扫一遍即可。

可以直接 FWT,这样是 \(n\log n\) 的。

D

答案不超过 \(\sqrt{nm}\),判定一个是否合法可以 \(nm\) 简单 dp,开始写了个暴力 \(nm\sqrt{nm}\),显然会 T。

发现答案是单调的,二分答案一下即可。

E

\(f_v\) 表示有多少条权值为 \(v\) 的边,这个可以容斥简单计算,接下来相当于变成了个背包问题。

\(g_n=\sum_{i=1}^n \varphi(i)\),那么 \(f_i=g_{n/i}\),所以 \(f_i\) 单调不增。

容易发现这个背包显然是选尽量大的有,但是可能会有剩余空间需要拿小的填而导致答案不优。

但是由于大的如果取完,大的有多余,那么小的肯定还有,所以直接贪心是对的,所以从大到小扫一遍即可。

F

算每个数的贡献,就是枚举前面比它小的和后面比他大的数,那么相当于算

\[\sum_{i=1}^k i^A(k-i)^B(i-1)^C(k-i+1)^D \]

这个东西算不了,但是会发现这是一个 \(n\) 次多项式,所以可以直接插值,也就是直接算 \(k\le n+2\) 时的点值。

下面是扯淡环节。

开始以为贡献的式子是:

\[\sum_{i=0}^k i^A(k-i)^B \]

这个式子可以直接用第二类斯特林数搞。

\[\sum_{i=0}^k i^A(k-i)^B=\sum_{i=0}^k (\sum_{p=0}^A \begin{Bmatrix}A\\p\end{Bmatrix}p!\binom{i}{p})(\sum_{q=0}^B \begin{Bmatrix}B\\q\end{Bmatrix}q!\binom{k-i}{q})\\ = \sum_{p=0}^A \sum_{q=0}^B \begin{Bmatrix}A\\p\end{Bmatrix}p!\begin{Bmatrix}B\\q\end{Bmatrix}q! \sum_{i=0}^k \binom{i}{p}\binom{k-i}{q}\\ = \sum_{p=0}^A \sum_{q=0}^B \begin{Bmatrix}A\\p\end{Bmatrix}p!\begin{Bmatrix}B\\q\end{Bmatrix}q! \binom{k+1}{p+q+1} \]

这样就可以 \(O(AB)\) 计算了,但是由于少了两项,加了两项后的式子不可做,所以白浪费了 30min 时间。

CF1763 div.2

时间:2022.12.28 13:45。

排名:34。

perf:*2767

题目 难度 是否做出 所用时间 备注 code
A *800 3min link
B *1200 6min WA*1 link
C *2000 18min link
D *2200 37min WA*1 link
E *2200 11min link
F *3000

题解(补题)

A

按位考虑,\(1\) 放在前缀最优。

B

模拟过程,按血量排序,指针从左向右移动,然后只需要进行一个后缀 \(\min\) 就可以知道怪物的攻击了。

C

降智题,发现这个操作非常阴间,但是会发现一次操作 \(|a_i-a_j|\le \max(a_i,a_j)\),所以最大值不会变,考虑是否可以把整个序列变成最大值,一个显然的操作是两个数操作两次就都变成 \(0\) 了,只需要对于最左边或者最右边的两个数进行两次操作,产生的 \(0\) 再与最大值操作,这样就可以把整个序列都变成最大值。

但是这种情况只能做 \(n\ge 4\),而 \(n<3\) 的情况又很简单,因此考虑 \(n=3\) 的情况。

如果最大值在第一个或者第三个位置,那么可以把所有数变成最大值,否则最大值如果在中间,可以发现进行任意一次操作后第一个位置和第三个位置中就有一个是最大值了,因此暴力枚举一次操作即可。

D

一直在想组合数一算,然后发现根本不可做,结果 \(n=100\),直接简单 dp 即可。

由于序列要求单峰,因此从小到大填数,每次填左边或者右边,设 \(f_{i,j}\) 表示左边放了 \(i\) 个数,右边放了 \(j\) 个数的方案数,在确定位置上判一下就好了,注意单调上升或下降的序列不合法。

E

简单题,这个东西咋计数,显然先缩点,互相可达的个数就是每个联通分量中的点两两可达。

所以直接 dp,设 \(f_i\) 表示可达数量为 \(i\) 的最小点数。

\[f_i=\min f_{i-j(j-1)/2}+j \]

暴力做,复杂度 \(O(n\sqrt{n})\)

然后考虑第二问,显然把选出的连通分量排成一条链最优,于是倒着 dp,设 \(g_i\) 表示还要放 \(i\) 个点,当前的单向可达数,在满足 \(f\) 是可以转移的情况下暴力 dp 即可,复杂度也是 \(O(n\sqrt{n})\)

CF1771 div.2

时间:2022.12.30 10:00。

排名:222。

perf:*2252

打的最烂的一场,状态很问号。

主要过 D 后吃饭去了,本来 E 应该能过的。

题目 难度 是否做出 所用时间 备注 code
A *900 3min WA*1 link
B *1400 3min link
C *1600 24min WA*1 link
D *2100 47min WA*1 link
E *2500 \(\color{green}\bigstar\) link
F *2500 \(\color{Gold}\bigstar\) link

题解(补题)

A

统计一下最大值最小值分别出现几次即可,注意判断全部相等的情况。

B

可以对于每个左端点找到最大的满足条件的右端点,所以双指针一下就好了。

C

分解质因数,但是只需要把根号内的质数扫一遍。

D

直接 dp,设 \(f_{i,j}\) 表示当前链的两个端点分别是 \(i,j\) 的答案,向外扩展即可。

一个更好写的写法是直接记忆化搜索,向中间推进。

E

枚举 H 横杠的左右端点,上下跑出最远距离,类似于子序列自动机。

最大值看成求方案数调一年。

F

以为 F 是什么高妙题,一开始想到的做法是先值域分块, hash 找到答案在那个块内,在块内暴力,直接暴力二分复杂度 \(O(n\sqrt{n}\log n)\),过不去,考虑 bitset 优化一下,对序列进行分块,整块的东西用 bitset 暴力存,小的暴力扫,复杂度 \(O(n\sqrt{n})\)

但是空间复杂度也是 \(O(n\sqrt{n})\),开不下,所以只能调块长,疯狂 TLE,不可过。

正解就是主席树一下,相当于做一个前缀和,然后找到满足奇数次的位置,比较板子。

CF1770 div.1+2

时间:2022.12.30 10:00。

排名:433。

perf:*2375

E 题目看错罚坐,不做评价。

题目 难度 是否做出 所用时间 备注 code
A 3min link
B 4min link
C 20min WA*1 link
D 18min link
E \(\color{green}\bigstar\) link
F \(\color{red}\bigstar\) link
G
H

题解(补题)

A

容易发现 \(b_m\) 必须取,剩下的排序选即可。

B

简单构造,n 1 n-1 2 即可,与 \(m\) 无关。

C

会发现 \(\gcd(a_i+x,a_j+x)=\gcd(a_i-a_j,a_i+x)\),所以先两两作差,然后条件就变成了若干组 \(x \not \equiv a\pmod p\),相当于如果 \(\mod p\) 意义下所有数都被限制掉了就无解,\(a_i-a_j\) 很大,但是可能被限制完的 \(p\le n^2\),所以可以把这些拿出来做即可。

注意判断 \(a_i=a_j\) 的情况。

D

考虑对于最后一个数而言,删数的人不可能给另一个人两个不同的数,因此这两个数必然相等,以此向前推,可以发现每组数至少有两个是相等的,要求就是这相等的数组成一个排列。

那么对于 \(a_i,b_i\),如果两个相同,相当于 \(c_i\) 可以随便填,否则就是二选一。

容易想到 \(a_i,b_i\) 连边,相当于定向后入度是 \(1\),边数等于点数,基环树森林,每个环两种方案。

E

看成是先选两个再进行过程了。

行走结束后统计两两距离之和,因此拆贡献到每条边。

每条边的贡献要么是子树乘以外面,要么会变一。

从小到大加边,设 \(f_i\) 表示 \(i\) 点有蝴蝶的概率,那么一条边变一得概率分别是 \(f_x(1-f_y)/2,f_y(1-f_x)/2\),然后更新 \(f_x,f_y\),可以发现如果两边都有或者都没有蝴蝶,那么不会变,否则蝴蝶等概率到一遍,因此 \(f_x=f_y=\frac{f_x+f_y}{2}\)

F

我开始想的神秘做法是考虑枚举异或和是多少,然后算方案数,这个可以 Lucas 然后拆成二进制的背包,但是很神秘而且不太对。

正解考虑或和恰好为 \(y\) 不太好搞,考虑做一个前缀和,如果设 \(f(y)\) 表示 \(y\) 对应的答案,那么令 \(g(y)=\oplus_{y'\in y} f(y')\),此处的 \(\oplus\) 是异或和。

这样的好处是先反演一下就可以得到 \(\oplus_{y'\in y} g(y')=f(y)\),而 \(g(y)\) 又相对比较好求,因为相当于就是每个 \(a_i\in y\)\(\sum a_i=x\) 的异或和。

此时令 \(C(i,x)\) 表示 \(a_i=x\) 的所有方案的异或和,那么容易得到 \(C(1,x)=C(2,x)=C(3,x)...\),如果 \(n\) 是偶数,所有都抵消,也就是答案为 \(0\),否则我们只需要考虑 \(C(1,x)\) 即可。

一个简单的做法是直接枚举 \(a_1\),那么后面的数和为 \(x\) 的方案,但是我们需要限定 \(a_i\)\(y\) 的子集,并且答案需要对 \(2\) 取模,可以用 Lucas 构造一下,也就是

\[\sum_{a_2+a_3+a_4...+a_n=n-a_1}\prod \binom{y}{a_i}=\binom{(n-1)y}{n-a_1} \]

相等的这步可以组合意义或者生成函数解释。

但是枚举 \(a_1\) 复杂度爆炸,按位考虑,枚举一个位 \(i\),钦定 \(a_1\) 这个位是 \(1\),类似的,可以得到

\[\sum_{a_1+a_2+a_3+a_4...+a_n=n-2^i}\binom{y-2^i}{a_1}\prod \binom{y}{a_i}=\binom{ny-2^i}{n-2^i} \]

CF1758 div.2

时间:2022.12.30 11:30。

排名:17。

perf:*3031

赢在CD没卡,而且罚时较少。

题目 难度 是否做出 所用时间 备注 code
A *800 2min link
B *900 2min link
C *1400 12min WA*1 link
D *1800 13min link
E *2500 18min link
F *3000

题解(补题)

A

\(s+rev(s)\) 即可。

B

一个简单的方法是全部放 \(1\) ,可以过 \(n\) 是奇数,偶数就考虑全部放 \(2\),最后两个位置放 \(1,3\)

C

如果没有 \(x\) 的限制,那么显然 \(p_i=i\)

但是现在把 \(x\) 拿走,需要放一个 \(n\),先把 \(n\) 放在 \(a_x\)

容易证明 \(x|n\) 不成立就无解。

否则考虑把 \(n\) 向后移动,那么就考虑每次找一个 \(x|j|n\),把 \(n\) 放到 \(j\) 那里去,这样每次找最小的 \(j\) 即可。

D

枚举 \(\max-\min\),那么 \(\sum a_i\) 已知,接下来构造就考虑 \(a_1=\min,a_n=\max\),中间的数可以凑出一个区间 \([l,r]\),然后这个区间可以整体右移 \(n\),那么直接看看这个区间是否包含 \(\sum a_i\) 然后构造即可。

必然有解保证了复杂度正确。

E

要想让全部变成一样等价于对于每一行设一个值 \(a_i\),每一列设一个 \(b_i\),那么 \(c_{i,j}=a_i+b_j\) 就是时钟的时间,相当于变成统计不同得 \(a,b\) 序列数量,但是这样会有重复,为了去重,强制令 \(a_1=0\) 即可。

考虑对于一个已知时间的钟 \(c_{i,j}\),我们令 \(a_i,b_j\) 连边,因为知道一个另外一个就唯一确定,那么形成一个图,这个和关系确定的图,上面可能会有环,如果存在奇环,那么要么无解要么解唯一,如果偶环,要么无解要么无数解。这就比较难维护,但是可以发现图是一个二分图,也就是没有奇环,因此只要钦定一个点的值后所有的边满足条件,那么就有 \(h\) 种方案。

因此答案要么是 \(0\),要么是 \(h^{连通块个数-1}\)

F

不想写代码。

大概就是考虑画成折线图,然后考虑修改的时候最多修改两个区间,线段树暴力维护即可。

CF1775 div.2

时间:2023.1.10 19:15。

排名:48。

perf:*2651

第一次赛时 AK div2,直接上 Master 了。

题目 难度 是否做出 所用时间 备注 code
A1 *800 4min link
A2 *900 0min link
B *1300 7min link
C *1600 11min link
D *1800 21min WA*1 link
E *2100 22min link
F *2500 34min TLE*1 link

A1,A2

简单构造,找到一个 \(a\) 作为 \(b\),一定满足条件,如果没有 \(a\),那么首尾分别是 \(a,c\) ,中间分给 \(b\) 即可。

B

两个集合要或相同,直接比较全部的并与扣掉一个的即可。

C

按位考虑,讨论一下即可。

D

每个数向它的质因数连边,边数只有 \(O(n\log n)\),大力 BFS。

E

从前向后贪心,记录一下前面操作以 \(1,-1\) 结尾的分别有多少,然后后面的数去贪心合并进去。

F

第一问简单,直接枚举矩阵的宽,然后填即可。

考虑第二问,我们枚举合法的矩阵的宽,显然数量只有 \(O(1)\) 个。

接下来考虑怎么放,假设要在 \(p\times q\) 的矩阵里放 \(n\) 个格子,那么考虑空位,也就是 \(s=p\times q-n\),必然满足 \(s\le min(p,q)\le \sqrt{n}\),可以发现空位一定填在四个角上,而且互不影响,因此求出一个部分的方案数即可。

这是简单的,直接设 \(f_{i,j}\) 表示放 \(i\) 个空格,上一行放了 \(j\) 个的方案数,需要满足这一行放的不超过上一行,只需要 dp \(\sqrt{n}\) 以内的即可,因此复杂度正确。

求四个角只需要自己与自己卷积即可。

然后就可以支持 \(O(1)\) 查询了,复杂度 \(O(\sum n)\),但是题目只保证了第一问 \(\sum n\) ,没有说第二问。

因此不能枚举每个宽,只需要在 \(\sqrt{n}\) 左右寻找合法的宽即可。

posted @ 2022-10-15 16:02  houzhiyuan  阅读(92)  评论(0)    收藏  举报