Loading [MathJax]/jax/output/CommonHTML/jax.js

Codeforces Round #441 (Div. 2)

嗯……好久不练习了。这一场的时间很好,所以试试参加。结果上看还好。

综述#

总共 6 道题,整体还是比较简单的。A、B、C、D、F 一次 Accepted,E 题只读题,没时间做了,赛后补掉了。C 题想的有点慢,F 写的有点慢。

题意和题解#

A. Trip For Meal#

加权无向无自环的三元图,问固定起点最短的有 n 个点的路径为多长。

显然在最短的边上抖动就好,如果那条边不和起点关联就走个最短的先过去。

B. Divisiblity of Differences#

n 个数,选 k 个模 m 同余的。

m 个桶,扔到对应余数的就行。随便找一个符题的桶输出就好。

C. Classroom Watch#

给一个数 x,找有哪些 n,满足 n 的十进制的各位和 sn 的和等于 x

s 范围很小,枚举 s,有 n0xs,看看得到的 n0 的各位和是不是 s 就行。

D. Sorting the Coins#

给一个长度为 n,初始全为0的数组,会有 n 次操作把数组的某一个位置改为1,问当前情况下,如果用冒泡排序,排完前最多会扫几次。

考虑最右边的0,找到它左面第一个1,这个1肯定会被换过来,并且刚好换到排好序的位置上;其它的1会与其右边连续的若干个0交换位置,但依然没有被交换到排好序的位置上,继续从头进行同样的操作,直到发现数组已经排好。这样就发现,排序的扫描次数就是从右边第一个0开始,左边的1的个数加一。所以,记一下总共有多少个1,末尾有多少个连续的1,两者的差加一即为答案。

E. National Property (2-sat)#

n 个数组,长度分别为 li,数组的元素为正整数都小于或等于 m,初始时数组的每个元素为“小写”,现在你可以让某些数字全部变成“大写”,让这些数组变成字典序升序(即大写小于小写,其余按正整数的比较方式比较)。

两两间比较时,遇到的第一个不同的位置会对这两个数字的大小写进行限制。比如两者关系在小写的时候是符合字典序的,那这两个数字应同时大写或同时小写;如果不符合字典序就直接限制在前面的数字取大写,后面的取小写;如果前缀都一样,但是前面的比后面的长,那答案就只能是否定了。这显然是一个 2-sat 模型,跑一个解就行。(对这个模型太不熟悉了,当时没想到)

F. High Cry (two pointers)#

给个长度为 n 的数组 ai,求有多少个区间 [l,r) 满足区间内所有值的二进制或严格大于区间最大值。

卡住右端点 r,考虑每一个左端点内区间的性质。会发现“区间或”的取值的个数是 O(loga),并且随左端点远离右端点,“区间或”单调不减,这样就可以维护“区间或”相同的左端点的范围了;进一步会发现“区间或”实际是大于或等于区间最大值的,为了方便,可以计算区间最大值刚好等于区间或的左端点范围(倒立做题);由于区间最大值也有单调不减的性质,因此可以对于每个“区间或”的值和区间,找在区间内和这个值相等的、最靠右的元素位置(开个 map 就行),从这个元素开始到“区间或”所在的区间的左端点就都是不符题的左端点范围了。

AtCoder CODE FESTIVAL 2017 qual C 开个小博客,沉浸在自己的空间

评论

Related Issues not found

Please contact @ChieloNewctle to initialize the comment

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×