Codeforces Round #610 (Div. 2) 解题报告

1282A - Temporarily unavailable

这个题目大家都会写,主要是怎么写比较优美。考虑被覆盖的长度:左端应该是两者左端的较大值;右端应该是两者右端的较小值。如果两者相交不难验证正确性。如果不相交,其值必定为负,也不难验证。于是有答案: ∣ r 1 − l 1 ∣ − m a x ( 0 , m i n ( r 2 , r 1 ) − m a x ( l 1 , l 2 ) ) |r_1-l_1|-max(0,min(r_2,r_1)-max(l_1,l_2)) r1l1max(0,min(r2,r1)max(l1,l2))

1282B2 - K for the Price of One (Hard Version)

根据题意想到是要构造最优解。先考查最优解的性质,假设买了m个商品,其中a个是单买的, b × k b\times k b×k 个是打包买的:

  • 买的东西一定是最便宜的m个,否则把最贵的换成更便宜的一定更优
  • a < k aa<k,否则将他们打包一定更优
  • 一定是前a便宜的单买,否则如果存在一个前a便宜的商品在打包内,记为A,记录本包内最贵元素为C ( C > A ) (C>A) (C>A),那么一定存在一个更贵的且单买的商品B。此时代价为 C + B C+B C+B 。将 A A A C C C 互换:如果 B > C B>C B>C,则新代价为 C + A ≤ C + B C+A\leq C+B C+AC+B ; 如果 B < C BB<C,则代价变为 B + A < B + C B+AB+A<B+C。答案总是更优。
  • 一定是价格相邻的k个商品打包,证明类似上一点,略

综上所示,最优解一定是前面a个商品单买,接下来只要支付 a + k a+k a+k , a + 2 × k a+2\times k a+2×k a + b × k a+b\times k a+b×k 这几项的价格即可。在给定总钱数的情况下,可以在线性时间下去检查最优解。即穷举单买个数,然后不停 + k +k +k 直到钱不够即可。

1282C - Petya and Exam

同样是构造最优解,考虑最优解性质:

  • 一定在 t i − 1 t_i-1 ti1 时间离开,或者在 T T T 时间离开 ,因为在此之间没有任务会变成必做,所以时间越长越好
  • 任意时间离开的最优解一定是先完成所有必做,然后尽可能先做选做的简单题,再做选做的难题

于是可以穷举离开时间,维护必做题时间前缀,然后按照第二条性质 O ( 1 ) O(1) O(1) 判断剩下的时间最多能做几个题。如果做完必做题剩余时间变成负的,那么则不可行,直接跳过。

变种1:如果有 k k k 种题目,则在做非必做题时遍历一边各种题型即可,复杂度为 O ( n × k ) O(n\times k) O(n×k)

变种2:如果有 n n n 道权重耗时各不相同的题目,那么在做非必做题时实质上变成一个背包问题,复杂度 O ( n × n × T ) O(n\times n\times T) O(n×n×T)。但是考虑前推离开时间的过程,相当于每次可选的物品少一个。对于一个离开时间,本质上等价于一次查询:剩余多少可分配时间,后几个元素是可选的。我们可以预先知道每一次查询的时间减去被必选占用的时间(即背包容量),以及前几个元素必选(那么其后的就是可选)。我们选取物品的顺序按照时间顺序从后往前来,可以一次性离线处理出所有的答案。最终复杂度 O ( n × T ) O(n\times T) O(n×T)

1282D - Enchanted Artifact

我们考虑两个等长的字符串之间的距离,恰好是相同位置上符号不同的数字的个数。因为修改总是比删除再增加要好。

在此基础上,我们可以在 n n n 次比较下得到答案,即每次换任意一个字符,如果距离比上一次小1,则说明改对了;如果比上次大1,则说明把对的改错了。

接下来我们考虑如何得到长度:一次输入300个a,300减去得到的答案就是a的个数,因为非a的位和空位对距离的贡献都是1。同理可以容易得到b的个数。于是可以得到长度。

我们考虑初始解为全a,这样可以在 n + 2 n+2 n+2 次试探后得到正确答案。注意到在试探后缀中首次出现的 b b b 时,就会被猜中答案,所以在某次试探时就可以得到答案并退出,不会超过 n + 2 n+2 n+2 次输入。注意特判一下全 a a a 的情况即可。

如果有 k k k 种字母,复杂度为 O ( k × n ) O(k\times n) O(k×n),在非对抗式的数据下,随机选取期望上只需要 k × n 2 \frac{k\times n}{2} 2k×n 时间。

1282E - The Cake Is a Lie

给的是一张平面图,我们可以将其转换为一张对偶图。因为三角形套在一起套成一个凸多边形,所以得到的对偶图一定是一颗树。在无向图上做拓扑排序可以得到顺序。

我们将这个凸多边形看成一张图,三角形每一个边视为一个边。要求凸多边形的点的顺序,只要求出其外壳的环。发现内侧边都是重边,外侧边都是单边,用set或者map维护找出所有单边,即可得到环。dfs可得答案。

你可能感兴趣的:(CF)