B - Christmas Trees
在x轴上种树,种树的坐标为
A
+
k
M
A+kM
A+kM
求
L
,
R
L,R
L,R之间(闭区间)有几棵树
首先将
L
R
LR
LR平移A,这样种树坐标为
k
M
kM
kM
然后求
L
L
L能包含的
k
k
k和
R
R
R能包含的
k
k
k
最后求出区间树的数量,注意两边都是闭区间。C++64位会越界,用python写就好了。
C - Socks 2
有
N
N
N对袜子,每种袜子都是一种颜色
C
i
=
i
C_i=i
Ci=i
现在有一些颜色
A
1
,
A
2
,
.
.
.
A
k
A_1,A_2,...A_k
A1,A2,...Ak少了一只,需要将其重新配对,若只剩奇数只袜子则扔掉一只。
配对后每对袜子的分数是
∣
C
i
−
C
j
∣
|C_i-C_j|
∣Ci−Cj∣
最小化总分之和。
首先是贪心配对,如单独的袜子是偶数,那么按小到大两两组合。
如例子
[
1
,
3
]
[1,3]
[1,3]中
如果是
[
1
,
2
]
,
[
2
,
3
]
[1,2],[2,3]
[1,2],[2,3],答案总分和
[
1
,
3
]
,
[
2
,
2
]
[1,3],[2,2]
[1,3],[2,2]是一样的。
我们在单独的袜子中观察,因为相邻的两项如果中间有成对袜子
记
a
i
<
b
<
a
j
a_i<b<a_j
ai<b<aj,其中
a
i
,
a
j
a_i,a_j
ai,aj是单独袜子,而
b
b
b是成对袜子
那么
(
b
−
a
i
)
+
(
a
j
−
b
)
=
(
a
j
−
a
i
)
+
(
b
−
b
)
(b-a_i)+(a_j-b)=(a_j-a_i)+(b-b)
(b−ai)+(aj−b)=(aj−ai)+(b−b)
也就是分数和成对袜子无关,只需要将单独袜子排序。当单独袜子是偶数时,直接两两组合。
如单独的袜子是奇数,那么需要遍历每一只可能丢弃的袜子
[
1
,
3
,
5
,
6
,
7
]
[1,3,5,6,7]
[1,3,5,6,7]
首先
3
−
1
+
6
−
5
3-1+6-5
3−1+6−5
然后
3
−
1
+
7
−
5
=
(
3
−
1
+
6
−
5
)
−
6
+
7
3-1+7-5=(3-1+6-5)-6+7
3−1+7−5=(3−1+6−5)−6+7
然后
3
−
1
+
7
−
6
=
(
3
−
1
+
7
−
5
)
+
6
−
5
3-1+7-6=(3-1+7-5)+6-5
3−1+7−6=(3−1+7−5)+6−5
然后
5
−
1
+
7
−
6
=
(
3
−
1
+
7
−
6
)
−
3
+
5
5-1+7-6=(3-1+7-6)-3+5
5−1+7−6=(3−1+7−6)−3+5
…交错进行更新。
D - Reindeer and Sleigh
有
N
N
N只雪橇,每只雪橇都是由
A
i
A_i
Ai只驯鹿拉动。
现在给出
X
X
X只鹿,问最多能拉几只雪橇。
裸考lower_bound的使用方法。
E - Christmas Color Grid 1
N
∗
N
N*N
N∗N的方格里面,每个格子为红或者绿。
随机抽一个红色的格子将其转换为绿格子,问转换后绿色的连通格个数的期望值。
首先dfs一遍绿色的连通格子数原来有几个
c
n
t
cnt
cnt,并对不同连通块标上号。
然后对于每个红格子,求其周围有几个不同的连通块
s
z
sz
sz,答案就是
c
n
t
−
(
s
z
−
1
)
cnt-(sz-1)
cnt−(sz−1)
F - Christmas Present 2
圣诞老人要给平面坐标上的
N
N
N个小朋友发礼物
他从
S
x
,
S
y
Sx,Sy
Sx,Sy点的家里出发,依次访问
1....
n
1....n
1....n号小朋友,最后需要回到家。
但是他一次只能携带
K
K
K件礼物,因此送完
K
K
K件礼物后需要回到家。
问圣诞老人最少的行程距离。
dp滑动窗口最值。
很明显的有
1...
n
1...n
1...n的状态划分,不要想去上一步维护礼物的数量,而是干脆用回到家作为一个状态结束的标志,然后维护
k
k
k步。
设
f
(
i
)
f(i)
f(i)为访问完
i
i
i个小朋友后回到家的最短距离。从
i
−
k
i-k
i−k切分状态。
f
(
i
)
=
min
{
f
(
i
−
k
)
+
d
i
+
d
i
−
k
+
1
+
p
a
t
h
(
i
−
k
+
1
,
i
)
}
f(i)=\min \bigg \{ f(i-k)+d_i+d_{i-k+1} + path(i-k+1,i) \bigg \}
f(i)=min{f(i−k)+di+di−k+1+path(i−k+1,i)}
其中
p
a
t
h
(
i
−
k
+
1
,
i
)
path(i-k+1,i)
path(i−k+1,i)代表从
i
−
k
+
1
i-k+1
i−k+1点到
i
i
i点的路径距离,这个距离可以用前缀和求出来:
s
[
i
]
−
s
[
i
−
k
+
1
]
s[i]-s[i-k+1]
s[i]−s[i−k+1]
整理可得:
f
(
i
)
=
min
{
f
(
i
−
k
)
+
d
i
+
d
i
−
k
+
1
+
s
i
−
s
i
−
k
+
1
}
k
<
=
K
f(i)=\min \bigg \{ f(i-k)+d_i+d_{i-k+1}+s_i-s_{i-k+1} \bigg \} \quad k<= K
f(i)=min{f(i−k)+di+di−k+1+si−si−k+1}k<=K
这里把
i
i
i相关的提出来,剩下的部分为:
f
(
i
)
=
min
{
f
(
i
−
k
)
+
d
i
−
k
+
1
−
s
i
−
k
+
1
}
+
s
i
+
d
i
k
<
=
K
f(i)=\min \bigg \{ f(i-k)+d_{i-k+1}-s_{i-k+1} \bigg \} + s_i+d_i \quad k<= K
f(i)=min{f(i−k)+di−k+1−si−k+1}+si+dik<=K
剩下的那部分就交由最小堆来解决。
G - Christmas Color Grid 2
N
∗
N
N*N
N∗N的方格里面,每个格子为红或者绿。
随机抽一绿色的格子将其转换为红格子,问转换后绿色的联通格个数的期望值。
前面和E题类似。求连通图的个数。
然后建图。tarjan求对每个节点割完后的连通子图个数。