Codeforces 伐木
在Codeforces上日常伐木,简易版题解。
将对自己有所帮助的题目进行加粗,对受到的启发进行记录。
以前补过的题会逐步更新
total: 42
codeforces Round #380 Based on Technocup 2017 - Elimination Round 2 (Div. 1 + Div. 2) 4/8
738A: A - Interview with Oleg: STL瞎搞题,帮助熟悉String 类是极好的。
738B: B - Spotlights: 横着扫一遍,竖着扫一遍?
737A: A - Road to Cinema: 二分一下可行的$v$,再找一遍符合条件的最小值。
737B: B - Sea Battle: 找找能放船的连续0序列,贪心打一遍就好。
codeforces Round #379 (Div. 2) 6/6
734A: A - Anton and Danik: 水题不表。
734B: B - Anton and Digits: 水题不表。
734C: C - Anton and Making Potions: 由于 $c_i$ 和 $d_i$是不降的序列,因此我们可以直接枚举 $b$ 二分 $d$求出所有的情况。
734D: D - Anton and Chess: 考虑两条斜线,一条横线一条竖线,可以注意到在线上的点的坐标均满足一定的数学关系,将这些线上的点分组放在一起排序,找到目标点最近的两个点看看会不会被吃就可以了。
734E: E - Anton and Tree: 首先相邻的两个点如果颜色相同,可以将这两个点缩为一个点。这样剩下的树应该是相邻两个点黑白相间的。很容易想到只要取树上最中间的点反复变色就好了。问题转化为求树上的最长链的一半。求一棵树上的最长链可以通过两次dfs,第一次任选一个点dfs,找到距离最远的点,该点一定是最长链上的一个端点,从该点再次dfs找到最远的另一个端点就是最长链。
734F: F - Anton and School: $b_i + c_i = n * a_i + \sum_{i=1}^{n}a_i$ , 通过这个式子很容易解出每一个$a_i$,在求解的过程中任何无法整除的情况都应该判为无解。将解求出后我们应通过所得答案再次计算每一个$b_i$和$c_i$ 来判断解是否正确。我们设$p_{w(a_i)}$ 为 $a_i$的第w位的值。统计$cnt_w = \sum_{i=1}^{n} p_{w(a_i)}$后 可以快速根据位运算的关系在 $O(loga_i)$的时间内求出每一项。
codeforces Round #378 (Div. 2) 5/6
733A: A - Grasshopper And the String: 水题
733B: B - Parade: 暴力,水题
733C: C - Epidemic in Monstropolis: 可以注意到,$b_i$ 其实是一段连续的 $a_i$的和,因此尝试将 $a_i$分段,枚举这一段中最大的可以吃人的 $a_i$,就可以秒天秒地了。这道题细节很多,考验码力。
733D: D - Kostya the Sculptor:可以注意到,如果要合并,每个矩形需要存在两条相同长度的边,因此枚举3种(将每种长度组合较小的边放前面)可能的边的组合情况,排个序。暴力枚举一下就好了。
733E: E - Sleep in Class: 首先明确不存在无限循环的情况。我们将楼梯看成染色,目的是将楼梯染色到底部或者是顶部。可以发现 $ans_i$ 只与位置小于$i$的'U'和位置大于$i$的'D'有关,维护一下'U'和'D'的位置的前缀和。很容易可以推出相关公式。
Canada Cup 2016 4/7
A - Jumping Ball: 水题
B - Food on the Plane: 水题
C - Hidden Word: 长度为27的串中包含26个不同字母,必定有有且仅有一对的字符出现,找到这一对相同的字符,填数就好。
D - Contest Balloons: 用优先队列维护比当前气球数多的 $(w_i - t_i + 1)$ 状态。贪心一遍,记录下过程中的最大值。
Codeforces Round #377 (Div. 2) 6/6
732A: A - Buy a Shovel: 水题不表
732B: B - Cormen — The Best Friend Of a Man: 水题
732C: C - Sanatorium: 暴力枚举,水题
732D: D - Exams: 二分答案,反向贪心检查。
732E: E - Sockets: 贪心的对$s_i$从小到大枚举,对于每个$s_i$ 开始从大到小枚举他所能匹配的$p_i$值。
732F: F - Tourist Reform: 我们可以想象,所有的边双连通分量可以相互抵达,所有的节点全部定向朝向最大的边双连通分量就是最优解了。利用Tarjan求出所有双连通分量,从最大的一个开始dfs,将所有的边定向就好了。
Codeforces Round #376 (Div. 2) 6/6
A - Night at the Museum: 水题,简单模拟
B - Coupons and Discounts: 考虑为奇数的天数和非零的连续段,贪心。
C - Socks: 按照同一天穿的袜子连边建图,将每个联通块染成同样的颜色,简单dfs就行了,初始化数组次数比较多,使用时间戳。
D - 80-th Level Archeology: 暴力模拟题,一层一层比较就可以,利用前缀和处理区间重叠问题。
E - Funny Game: 有趣的博弈类DP,每次操作其实都是取出前i位前缀和,$dp[i] = $ 取到第i个数字时之后的最优解, $ dp[i] = max \{ \sum_{t=1}^{j}{a_t}- dp[j+1] | i \leq j \} $
F - Video Cards: 暴枚举每一个可能的值,通过统计每个值出现的个数,利用前缀和快速得到对应区间内的数量,计算每一种情况的答案。
Codeforces Technocup 2017 - Elimination Round 1 2/6
727A: A - Transformation: from A to B: 贪心水题,反向回溯,同一时间你只有一种操作可以选择。
727B: B - Bill Total Value: 恶心的字符串模拟,格式控制。
codeforces round #372 (Div. 2 + Div. 1) 3/7
716A: A - Crazy Computer: 水题,细节。
716B: B - Complete the Word: 水题,hash记录。
715A: A - Plus and Square Root: 看似吓人的问题。构造等式 $m_{k+1}^2(k+1)^2 = m_{k}k$ 其中$k$为当前level,要升级必然满足这个等式,由于仅仅考虑可行解,令$m_{k+1}=k$ 可得 $k (k+1)^2 = m_k $。假设所有递推都按此进行,则每次得到 level 为$k+1$时,其都是$k+1$的$k$倍。因此每次更新所需的答案是$ k(k+1)^2 - (k-1) $。
Codeforces Round #325 (Div. 2) 1/6
586D: D - Phillip and Trains: 从左往右bfs一遍或者dp一遍似乎就过了啊。
Codeforces Round #286 (Div. 2) 1/5
505A: A - Mr. Kitayuta's Gift: $|s|$很小,暴力可过,不过存在$O(n)$的做法。
Codeforces Round #281 (Div. 2) 1/6
493D: D - Vasya and Chess: 一个很机灵的题,对称性博弈。考虑奇数情况,白方无论怎么走,只要黑方对称性地动,则白方必败,同理偶数次,只要先手的白方右侧平移一格就转化为奇数次。故只需要简单的模2判断奇偶性就做完了。
Codeforces Round #241 (Div. 2) 1/5
A. Guess a number!: 通过给的条件划定可能存在的区间,随便输出一个值就好。
Codeforces Round #178 (Div. 2) 1/5
294B: B - Shaass and Bookshelf: DP构造,考虑为01背包或者说多重背包。考虑所有书籍平铺时候的总宽度之和是一定的,因此只需要我们在不同的厚度(背包容量,背包要求恰好装满)下,所能减少的平铺厚度最大。
当此时的总厚度 $w_{total}$ 减去最大值$w_{maxt_{i}}$ 小于背包容量时,解合法,找出背包容量最小的合法解。
Codeforces Beta Round #19 1/5
B - Checkout Assistant: DP构造,我们可以将问题转化为01背包,每个物品的权值是$c_i$,开销是 $t_i + 1$我们要使容量介于 $n$ 到 $ n + t_{max} $ 之间权值最小的方案。

浙公网安备 33010602011771号