Problem 1
题目大意
有一棵树,上面有 m m m 个运动员,每个运动员以每秒 1 1 1 条边的速度运动,其中对于运动员 i i i ,他从第 0 0 0 秒从 S i S_i Si 出发,沿最短路径到达 T i T_i Ti 。每一个节点会在比赛开始后在第 w i w_i wi 监视运动员。问每个节点监视时有多少个运动员。
赛时
有两个思路:
- 打暴力, O ( n m + n l o g n ) O(nm+nlogn) O(nm+nlogn),期望25pts
- 树链剖分+multiset , O ( n l o g n × m u l t i s e t 复杂度 ) O(nlogn \times multiset复杂度) O(nlogn×multiset复杂度),期望95pts,可惜不会打multiset
还好没有挂分
正解
lca+树上差分
对于每个运动员
i
i
i :
- 设 l c a i lca_i lcai 为 S i S_i Si 和 T i T_i Ti 的最近公共祖先
- 将路径 (
S
i
S_i
Si,
T
i
T_i
Ti) 拆成 (
S
i
S_i
Si,
l
c
a
i
lca_i
lcai) 和 (
l
c
a
i
lca_i
lcai,
T
i
T_i
Ti) 两部分
- 对于 ( S i S_i Si, l c a i lca_i lcai) ,可产生贡献的点 p p p 满足 d e p p + w p = d e p S i dep_p+w_p=dep_{S_i} depp+wp=depSi
- 对于 ( l c a i lca_i lcai, T i T_i Ti) ,可产生贡献的点 p p p 满足 d i s t ( S i , T i ) − w p = d e p T i − d e p p dist_{(S_i,T_i)}-w_p=dep_{T_i}-dep_p dist(Si,Ti)−wp=depTi−depp 即 d i s t ( S i , T i ) − d e p T i = w p − d e p p dist_{(S_i,T_i)}-dep_{T_i}=w_p-dep_p dist(Si,Ti)−depTi=wp−depp
- 用两个桶进行维护
Problem 2
题目大意
有n只蚯蚓进行m次操作:
- 选出一只最长的蚯蚓然后切为 p × x p\times x p×x 和 x − p × x x-p\times x x−p×x两部分
- 其余未选中的蚯蚓长度+
q
q
q
( p p p 和 q q q 均为常数)
问这m次选择蚯蚓的长度和m次操作后每只蚯蚓的长度
赛时
无脑模拟,加优先队列优化,期望65pts
正解
不难发现被切的蚯蚓的长度不断变小,于是开三条队列维护即可
Problem 3
题目大意
不想赘述啊
有一个序列
a
i
a_i
ai ,在其中选出序列
p
j
p_j
pj 使得
A
−
i
×
X
+
∑
p
j
a
p
j
+
X
A-i\times X+\sum_{p_j}{a_{p_j}+X}
A−i×X+∑pjapj+X
要找到一个序列使得
∑
[
b
i
−
b
i
−
1
−
∑
[
b
i
−
1
<
p
j
≤
b
i
]
≥
h
i
]
\sum{[b_i - b_{i-1} - \sum[b_{i-1}<p_j\le b_i]\ge h_i]}
∑[bi−bi−1−∑[bi−1<pj≤bi]≥hi]最大
赛时
dp
f
i
,
j
f_{i,j}
fi,j表示前i个区间贡献j个价值时最大值
从
f
i
−
1
,
j
f_{i-1,j}
fi−1,j和
f
i
−
1
,
j
−
1
f_{i-1,j-1}
fi−1,j−1贡献过来
O
(
m
2
+
n
l
o
g
n
)
O(m^2+nlogn)
O(m2+nlogn),期望100 90->80pts
正解
赛时状态转移方程错了,需在方程中进行贪心。 O ( m 2 n l o g n ) O(m^2nlogn) O(m2nlogn)
Problem 4
题目大意
有一棵 n 个节点,以 1 号节点为根的有根树,每个节点有点权
a
i
a_i
ai 。
对于一个三元组
(
x
,
y
,
z
)
(x,y,z)
(x,y,z),如果满足
a
x
+
a
z
=
a
y
a_x+a_z=a_y
ax+az=ay,并且
x
x
x 是
y
y
y 的祖先,
y
y
y 是
z
z
z 的 祖先,那么就称这个三元组是好的。请你输出一共有多少好的三元组。
赛时
暴力,期望30pts->25pts
正解
树分块不会待学
总结
- 有空的时候学一些stl,以便自己打代码,同时便于找到思路
- 多积累新算法
- 正常发挥,不要挂分!!!