CodeForces

CodeForces 做题记录

Codeforces Global Round 27

A Sliding

\((r, c)\) 被取走时:

  • \(\forall i \in [r + 1, n], (i, 1)\) 会移动到 \([i - 1, m]\),曼哈顿距离为 \(m\)
  • \(\forall i \in [r + 1, n], j \in [2, m], (i, j)\) 会移动到 \((i, j - 1)\),曼哈顿距离为 \(1\)
  • \(\forall i \in [c + 1, m], (r, i)\) 会移动到 \((r, i - 1)\),曼哈顿距离为 \(1\)

统计起来即可,答案为 \((m - 1) * (n - r) + (n - r) * m + (m - c)\)

代码

A题写的也太慢了……
该推快一些的。

B Everyone Loves Tres

有一个数学结论:一个用十进制表示的数,如果其奇数位的和与偶数位的和的差的绝对值为 \(11\) 的倍数,那么这个数为 \(11\) 的倍数。

那么构造 \(n\) 位的最小的 \(11\) 的倍数,再乘上 \(3\) 即可,很显然 \(n = 1\),或 \(n = 3\) 时不可能成立。

又因为 \(2 \mid 66\),所以最后两位应该为 \(66\)

如果 \(2 \mid n\),容易发现只需要最后两位为 \(66\) 其他均为 \(33\) 即可,此时满足数学结论。

否则,因为奇数位比偶数位多一位,所以可以用两位 \(3\) 合成一个 \(6\)。那么只需最后四位为 \(6366\),其他均为 \(3\) 即可。

代码

很显然的题目,但是 \(14\) 分钟才写出来。而且还不知道有数学结论。

D Yet Another Real Number Problem

思路很显然。

考虑前 \(i\) 位时,一定会把前 \(i\)\(2\) 的次幂和给到一些数,记第 \(k\) 个被给 \(2\) 的数的下标为 \(g_k\)

记一个区间 \([i, j]\)\(2\) 的次幂的和为 \(t(i, j)\)

对于当前考虑的 \(a_i\),如果将 \(a_i \times 2^{(g_k + 1, i - 1)} \gt a[g_k]\),那么令 \(g_k = i\) 即可。

又因为 \(a_i \le 1\times 10^9\),故 \(g_{k} - g_{k - 1} \lt 30\),否则直接合并即可。

重复执行上述操作,直到不满足为止。

因为会不断删去前面的 \(g\),最多跳 \(30\) 次,故从左向右执行上述操作的时间复杂度大概为 \(O(n\log a_i)\)

发现删去 \(g\) 类似维护单调性,故可以用单调栈维护。

代码

没有想到用单调栈是真做的少了……

Educational Codeforces Round 171 (Rated for Div. 2)

A Perpendicular Segments

因为题目保证有答案,输出最大值即可。最大值即为边长为 \(\min(x, y)\) 的正方形的对角线。代码

这题目还能吃一发罚时是真的菜。

B Black Cells

因为只能有一个格子被涂黑可以不属于 \(A\),而被涂黑的格子是两两匹配的。

所以 \(n\) 为奇数时会有一个被断开。\(O(n^2)\) 的检查一遍即可。代码

写了好久,略显睿智。

C Action Figures

从后往前遍历,如果前面有 0 可以用就用,否则用 1代码

逆天没想出来,对题目的考虑不够全面。

D Sums of Segments

维护了好多前缀和……

\(B\) 按起点分类为 \(n\) 类。

对于每一类可以维护其总和,对于每一类内部又维护前缀和。

每次询问可以二分地找到 \(l, r\) 分别属于哪个类。然后容斥地求和就好。代码

调试了好久,调出来到也算进步。不过这么简单的题要写快一些,写题最好先打好草稿。

Codeforces Round 983 (Div. 2)

A Circuit

最小数显然当最多的开着的开关连接同一个开关取到,最大数恰好相反。代码

输入格式要好好看啊。

B Medians

\(k\) 的位置会将 \(a\) 分成两个奇偶性相同的段。

显然只要令 \(k\) 单独成段,将另外两段分为长度为奇数的段即可。代码

吃了发罚时,起码该写好草稿。

C Trinity

显然排序后检查每个数为最大值时需要改变多少数即可。赛时的 sb 代码

但是可以排序后检查那两个数是最小值需要改变的数是多少。代码

代码的实现难度应该是一样的,但是不知道为什么我写的那么唐。题写的少导致的。

Codeforces Round 984 (Div. 3)

A Quintomania

检查一遍就好。代码

出现把&&写成||的神奇失误。

B Startup

货架上如果放了某品牌汽水,那么所有该品牌的汽水都可以放。

那么计算某个品牌的所有价值,取总价值前 \(n\) 的的品牌即可。代码

出现逆天题目没看完已经吃了发罚时的情况,直接心态崩了。

C Anya and 1100

一个位置最多对 \(4\) 个子串有影响。检查一遍就好。代码

写的时候唐完了,写了 \(100\) 多行。

\(2\) 题破防了,第 \(3\) 题写的时候老着急了。

心态不行,自己和自己爆了也是无敌。

D I Love 1543

和 C 差不多,暴力检查就好了。代码

第二天发现因为把四个 \(i\) 写成四个 \(t\) 导致没过。

直接破防。

总结

以后写题还是考虑一下写法,不然太唐了。

Refact.ai Match 1 (Codeforces Round 985)

C New Rating

solution 1

有一点很显然,从第 \(1\) 个位置到第 \(i\) 在不跳过的情况下,假设最大的结果为 \(x\),那么 \(1 \rightarrow i\) 的结果会取便 \([0, x]\)

因为从一位到另一位,结果总是 \(+1, -1\) 或不变。

于是可以二分搜索呢。

考虑二分最后的答案为 \(k\)

从最后一位向前遍历到该位所需要的结果。

\[k = \begin{cases}k - 1,&a_{i + 1} < k\\k + 1, &a_{i + 1} > k\end{cases} \]

只要前缀最大值比 \(k\) 大就行。代码

solution 2

可以动态规划。

假设跳过区间为 \([l, r]\)

\(\forall i \in [1, n]\)\(i\) 的所处状态只有三种,\(i < l, i > r\) 或者 \(l \le i \ge r\)

假设 \(f_{i, 0/1/2}\) 表示 \(i\) 分别处于这三种状态时的最大值。

定义 \(c(v, x)\) 表示当前值为 \(v\)\(a_i\) 值为 \(x\) 时的结果。

对于 \(f_{i, 0}\)\(f_{i, 0} = f_{i - 1, 0} + c(f_{i - 1, 0}, a_i)\)

对于 \(f_{i, 1}\), \(f_{i, 1} = \max(f_{i - 1, 1}, f_{i - 1, 0})\)

对于 \(f_{i, 2}\), \(f_{i, 2} = \max(c(f_{i - 1, 1}, a_i) c(f_{i - 1, 2}), a_i)\)

最后的答案是 \(\max(f_{n, 1}, f_{n, 2})\)

代码

D Cool Graph

首先可以把图全拆成点或边。

假设每次选择 \(u (d_u \ge 2)\)\(v, w(v, w \in son_u)\) 进行操作。

最后,\(\forall i \in [1, n], d_i \le 1\)。因为每次至少会减少一条边,故操作次数最多为 \(m - 1\) 次。

如果此时 \(\forall i \in [1, n], d_i = 0\),就已经是一张酷图了。输出答案即可。

否则,随便选择一个点为基点,将别的点合并即可。

对于 \(i \in [1, n]\),如果 \(d_i = 0\),那么把它和已经合并好的树上的任一条边和并,原边会消失,而 \(i\) 会与树上两点连边。

对于 \(i \in [1, n]\),如果 \(d_i = 1\),把 \(i, son_i\) 与树上任一点连边。则这条边消失,树上一点与 \(i, son_i\) 连边。

每次至少消失 \(1\) 个孤单的点,故最多进行 \(n - 1\) 次操作。

代码

有趣的题目,没有思绪就该进行一下模拟呢。

待补:

Educational Codeforces Round 171 (Rated for Div. 2)

E Best Subsequence:好像是网络流。

F Bermart Ice Cream:好像很难。

posted @ 2024-10-29 13:10  FRZ_29  阅读(38)  评论(0编辑  收藏  举报