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\) 大就行。代码。
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:好像很难。