7月13日 Codeforces Round #496 题目链接:http://codeforces.com/contest/1005
A - Tanya and Stairways & B - Delete from the Left
过水,不多说。。。
C - Summarize to the Power of Two
思路: $O(nlogn^2)$的比较暴力的做法,估计不是正解,水过去的QWQ
就是对于一个数$a[i]$,我们可以枚举所有的2的次幂,找到数组$a$在中是否有另一个数$a[j]$,使得它们和为2的次幂,这个可以用map维护。但是要注意一个细节就是a[i]本身是2的次幂,这个要特判一下。
代码:
1 |
|
D - D - Polycarp and Div 3
思路: 首先有一个引理:就是如果有一串长度大于3的数字它们和能被3整除,那么一定有一个连续字串的和也能被3整除。
这个比较显然,证明就不多说了。我们进行DP,根据上面的引理,每个$f[i]$会只从它前面的$f[i-1],f[i-2],f[i-3]$转移而来,所以就直接$O(n)$扫一遍就好了。(DP如何转移就看代码好了,比较简单)
代码:
1 |
|
E1 - Median on Segments (Permutations Edition)
思路: 这题我的思路和题解的也不太一样。(其实是当时想一口气做出两个来,结果发现这个思路E2有BUG)
首先我们对于序列中数的大小是不关心的,只关系它与k的关系。所以可以把比k小的看成-1,比k大的看成1,然后维护前缀和,记为num[i]。我们同样记录k的位置pos,那么答案就是在pos两边有多少对i,j使得$num[i]=num[j]$或$num[i]=num[j]+1$。所以我们cnt数组记录在pos前$num[i]$的数量,对于pos后的$num[i]$就将$cnt[num[i]]$和$cnt[num[i]-1]$加入答案。
代码:
1 |
|
E2 - Median on Segments (General Case Edition)
思路: 这道题自然是没有想到的QWQ…..膜了下题解
由于直接求中位数为m的序列是不好求的,所以我们可以变一下,求中位数大于m的序列。那么答案就是做一个容斥,为中位数大于m的序列—中位数大于m+1的序列。
那么求中位数大于m的序列的做法和上一题我的做法有些相似。$num$是前缀和,$cnt$数组记录数量,由于长度为偶数时中位数是中间较小的那个,所以操作的顺序是不一样的。
代码:
1 |
|
F - Berland and the Shortest Paths
思路: 用BFS一遍处理出每个点深度,用个vector记录每个点连向父亲的边(可能有多个父亲)。因为每个点vector中存的边可以随便取,所以用dfs乱搞一下计算出答案。
代码:
1 |
|