Codeforces Round 919 (Div. 2)
如果有没能看懂的地方,欢迎加qq与我讨论,qq在个人简介处。
C - Partitioning the Array
难度:1500
链接:Problem - C - Codeforces
思路:
1.每个数组的对应位置的余数相等
设
A
1
=
x
1
m
+
b
,
A
2
=
x
2
m
+
b
.
.
.
A_1=x_1m+b,A_2=x_2m+b...
A1=x1m+b,A2=x2m+b...
B
1
=
x
1
m
+
b
,
B
2
=
x
2
m
+
b
.
.
.
B_1=x_1m+b,B_2=x_2m+b...
B1=x1m+b,B2=x2m+b...
上式减下式有:
(
x
1
−
y
1
)
m
,
(
x
2
−
y
2
)
m
(x_1-y_1)m,(x_2-y2)m
(x1−y1)m,(x2−y2)m如果存在一个
m
m
m满足相同的
b
b
b则会存在这两部分有一个公因子,所以这两部分存在gcd即可。
2.然后共有
n
n
n的因子的数量的
k
k
k,挨个枚举即可。
D. Array Repetition
难度:1800
链接:Problem - D - Codeforces
思路:
1.一个数字不是出现在倍增的区域就是出现在新增加的区域中。所以定义一轮为[倍增+尾插]。
2.记录第
i
i
i轮倍增的段数和新增加的数字个数。如果一个数字属于倍增的区域,那么可以递归到前一轮的相应位置。如果一个数字属于新增的位置,直接输出即可。
3.特殊情况,如果在最后一次倍增的时候大于可以倍增的次数(越过了
1
0
18
10^{18}
1018的界限),就取消这次倍增。所以整个区间为[xxxxx,倍增超限区]。如果此时一个q询问了倍增超限区,则直接进行递归查询上一个区间即可。
4.注:
u
l
l
ull
ull的最大值为
−
1
-1
−1。
E. Counting Binary Strings
难度:2100
链接:Problem - E - Codeforces
思路:
1.对于
.
.
.
0001000...
...0001000...
...0001000...的一个串,好串的个数是
(
a
左
+
1
)
∗
(
a
右
+
1
)
(a_左+1)*(a_右+1)
(a左+1)∗(a右+1)(
a
a
a表示
0
0
0的个数)
2.考虑
d
p
dp
dp,存在以下几种情况
d
p
[
i
]
[
j
]
[
0
/
1
]
dp[i][j][0/1]
dp[i][j][0/1]表示有了
i
i
i个好串,最后一个是
0
0
0或
1
1
1,(
0
0
0或
1
1
1)前面有
j
j
j个
0
0
0。
3.
0
0
0后面加上一个
1
1
1,那么
d
p
[
i
+
j
+
1
]
[
j
]
[
0
]
dp[i+j+1][j][0]
dp[i+j+1][j][0]会增加
d
p
[
i
]
[
j
]
[
1
]
dp[i][j][1]
dp[i][j][1]个。
4.
1
1
1后面加上
l
l
l个
0
0
0,那么
d
p
[
i
+
l
∗
(
j
+
1
)
]
[
l
]
[
1
]
dp[i+l*(j+1)][l][1]
dp[i+l∗(j+1)][l][1]会增加
d
p
[
i
]
[
j
]
[
0
]
dp[i][j][0]
dp[i][j][0]个,并且
i
+
l
∗
(
j
+
1
)
≤
n
,
j
+
l
<
k
,
1
≤
l
i+l*(j+1) \le n,j+l<k,1\le l
i+l∗(j+1)≤n,j+l<k,1≤l。
5.
0
0
0后面加
0
0
0的情况被归如
1
1
1后面加
l
l
l个
0
0
0中了。
6.
1
1
1后面加
1
1
1的情况则为
d
p
[
i
+
1
]
[
0
]
[
1
]
+
=
d
p
[
i
]
[
j
]
[
1
]
dp[i+1][0][1]+=dp[i][j][1]
dp[i+1][0][1]+=dp[i][j][1]。
注:
这道题的时空限制卡的非常严格,在补题的过程中一直tle test8,后来发现原因是初始化时的vv<vv<vv>>(…)次数过多了,后面改成了双重for循环初始化n,k过了,发现了双层for循环的初始化更低。