感觉是很久没打Codeforces了,有点手生,前期卡题很严重。
C题明明有简单的贪心,却想了很久的DP,还是个错的,D题还读错了题,没读到取最大值,白想了很久。最后的G题感觉也有点超出能力范围了。
直接一手
−
9
-9
−9 rating。永远不变的真理:不打等于上分。
A Bovine Dilemma
题意
给出 n ( n ≤ 50 ) n\ (n\le50) n (n≤50) 个 x i x_i xi 表示直角坐标系上,X正半轴上的 n n n 个点 ( x i , 0 ) (x_i,0) (xi,0)。求从中任选两个点和 ( 0 , 1 ) (0,1) (0,1) 点能组多少个面积不同的三角形。
题解
直接认为X正半轴上的点是三角形的底,那么三角形的高已经固定是 1 1 1 了,此时只要判断有多少种不同的底即可,那么 n 2 n^2 n2 枚举即可。
B Last minute enhancements
题意
给出 n ( n ≤ 1 0 5 ) n\ (n\le10^5) n (n≤105) 个 a i ( a i ≤ 2 × 1 0 5 ) a_i\ (a_i\le2\times10^5) ai (ai≤2×105),每个数字可以保持原样或者 + 1 +1 +1,请问最多能构造出多少个不同的数字。
题解
从小到大排序,对于当前的数字,如果在之前出现了,那么就 + 1 +1 +1,否则保持不变,这样贪心即可。
C Canine poetry
题意
给出一个长度不超过 1 0 5 10^5 105 的字符串,可以任意更改每一位上的字符,求最少更改多少个字符,使得字符串中不包含长度大于 1 1 1 的回文子串。
题解
其实要求长度不大于 1 1 1 是非常苛刻的,这意味着:
- 相邻的两个字符不能相同,否则形如 a a aa aa 的字串就是回文的。
- 隔一位相邻的两个字符不能相同,否则形如 a b a aba aba 的字串就是回文的。
满足这两个条件即可,这样奇回文和偶回文都不存在了。
其实从左到右贪心地修改,每次使得当前字符和前两个字符不同即可,不需要考虑对后面的影响,因为小写字母有26个,总是能找到一个没有后效性的字符。
可以用一个
@
@
@ 字符表示绝对不会相同的字符。
D 13th Labour of Heracles
题意
给出一颗规模为
n
(
n
≤
1
0
5
)
n\ (n\le10^5)
n (n≤105) 的树,树上的每个结点都有一个权值
w
i
(
w
i
≤
1
0
9
)
w_i\ (w_i\le10^9)
wi (wi≤109)。
现在可以对树的边进行
k
k
k 染色,染色后:对于每种颜色,提取出该颜色的子图(该颜色的所有边以及这些边连接的点),子图中的每个连通块中所有点的权值和记为这个连通块的得分,所有连通块中最大得分是这个颜色的得分。
对于一种染色方案,所有颜色的得分求和就是这个染色方案的得分。
现在要求
k
k
k 染色的最大得分,
k
k
k 从
1
1
1 到
n
n
n 都要输出。
题解
k
k
k 从
1
1
1 到
n
n
n 都要输出,其实已经说明了这个题目需要动态地解决。
首先
1
1
1 染色只有一种方案。当我们需要
2
2
2 染色时,我们发现,如果第二种颜色和第一种颜色正好分开这棵树,两个子图都只有一个连通块时,染色方案的得分正好比
1
1
1 染色多出那个两种颜色分割点的权值。而且不难发现,如果任意一种颜色的子图有多个连通块时,整体的得分将大打折扣。
所以,我们希望这个分割点的权值尽可能大,那就让这个点是整棵树权值最大的点就行了。
但是,如果这个点是个叶子结点,显然是不行的,所以,一个点能够充当多少次分割点,就是他的 度数
−
1
-1
−1。
所以,给所有的点按权值从大到小排序,不断更新得分即可。
E Apollo versus Pan
题意
给出
n
(
n
≤
5
×
1
0
5
)
n\ (n\le5\times10^5)
n (n≤5×105) 个
x
i
(
x
i
≤
2
60
)
x_i\ (x_i\le2^{60})
xi (xi≤260),求:
∑
i
=
1
n
∑
j
=
1
n
∑
k
=
1
n
(
x
i
&
x
j
)
⋅
(
x
j
∣
x
k
)
\sum_{i=1}^n \sum_{j=1}^n \sum_{k=1}^n (x_i \, \& \, x_j) \cdot (x_j \, | \, x_k)
i=1∑nj=1∑nk=1∑n(xi&xj)⋅(xj∣xk)
题解
这题看着吓人,
5
×
1
0
5
5\times10^5
5×105的规模下,要算一个
n
3
n^3
n3 的东西,其实不难。
当我们固定一个
a
j
a_j
aj 和
a
i
a_i
ai 时,我们发现后面的
(
x
j
∣
x
k
)
(x_j \, | \, x_k)
(xj∣xk) 其实是可以预处理出来的,它就只是个一个数字和所有数字的
a
n
d
and
and 和而已,此时它就可以作为一个常数了,当我们只固定
a
j
a_j
aj 时发现,
(
x
i
&
x
j
)
(x_i \, \& \, x_j)
(xi&xj) 也是能预处理的,也能提取出来,那么整个式子就可以化为:
∑
j
=
1
n
S
u
m
o
f
A
N
D
j
⋅
S
u
m
o
f
O
R
j
\sum_{j=1}^n SumofAND_j \cdot SumofOR_j
j=1∑nSumofANDj⋅SumofORj
那么这两个预处理可以按位拆分分别算贡献即可,整体复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) 的。
F Euclid’s nightmare
题意
给出
n
n
n 个
m
m
m 维的向量,这些向量的每一维都是只有
0
,
1
0,1
0,1 的,向量做加法时,每一维求和都会
m
o
d
2
mod\ 2
mod 2。
特别地,每个向量最多有两维是
1
1
1 ,其余维度都是
0
0
0 。
任取这
n
n
n 个向量集合的一个子集求和可以得到一个向量,这些向量构成一个新的集合
T
T
T,求
T
T
T 集合的大小
∣
T
∣
|T|
∣T∣。(特别的,如果子集为空,那么求出的向量为
0
0
0 向量)。
同时,求出最小的子集
S
′
S'
S′,使得这个子集能求出的新集合大小即为
∣
T
∣
|T|
∣T∣,多个方案求字典序最小的方案。
题解
首先我们可以知道,向量集合可以写成一个矩阵,矩阵中被化简掉的行是无效的,因为这些行可以被别的行表示。
突破口在于每个向量只有两维是
1
1
1。
对于每个维度,它有三种状态,第一种是它还不能被表示出来,第二种是它能被表示出来,但它是和另一个维度捆绑的,第三种是它能被自由地表示出来。
那么我们没加入一个向量,就看他是否能更新我现有的这些状态,能就加入集合,不能就Skip。
整体的更新可以用一个并查集表示,自由的维度就和第
m
+
1
m+1
m+1 个虚点连接即可。