Codeforces Round #588 (Div. 1)

Contest Info


[Practice Link](https://codeforc.es/contest/1229)
Solved A B C D E1 E2 F
3/7 O O Ø - - - -
  • O 在比赛中通过
  • Ø 赛后通过
  • ! 尝试了但是失败了
  • - 没有尝试

Solutions


A. Marcin and Training Camp

题意:
(n)个人,一共有(60)种属性,每个人有若干种属性,用(60)位的二进制串表示,并且每个人都有一个能力值(b_i)
现在要选择若干人组成集合,使得对于每个人,集合中都至少存在一个人的属性集合等于它的属性集合或者是它的超集
现在要使得选出来的人的能力值之和最大。

思路:
对于一种能力值属性集合,如果存在两个人或者以上的人拥有这种能力值属性集合,那么这个就能选,并且它的所有子集都可以选。贪心即可。

B. Kamil and Making a Stream

题意:
给出一棵树,考虑(f(u, v))表示(u)(v)路径上所有点权的(gcd)
现在要求:

[egin{eqnarray*} sumlimits_{u ; is ; an ; ancestor ; of; v} f(u, v) end{eqnarray*} ]

思路:
考虑一条链上最多只有(log)个不同的(gcd),那么倍增维护一下跳跃即可。
或者直接对于每个点用个(map)维护(gcd)出现次数。

C. Konrad and Company Evaluation

题意:
有一个(n)个点(m)条边的有向图,有(q)个操作,每次操作将(u)的所有边都改成出边。
询问每个点的出度乘入度之和是多少。

思路:
我们考虑每次要修改的边都是入边。
那么对于每个点,我们只存他的入边,然后暴力操作。
感觉是对的,复杂度是均摊的。