A
、
B
、
E
、
G
、
H
、
I
A、B、E、G、H、I
A、B、E、G、H、I代码见
g
i
t
h
u
b
github
github链接:点击这里
比赛时候真的很可惜,差点可以校
d
i
v
2
r
a
n
k
1
div2 rank1
div2rank1的,和第一差了一分钟的罚时(不到)
只做出来五题,
E
E
E只是运气好,数据比较弱。
正解在这里,不过我并没有看懂:
B Fire-Fighting Hero
题意
给定无向图
求
k
k
k个点到所有点最短路的最大值。
求某个点到所有点的最短路的最大值
题解
第二条显然很简单
第一条的话,如果我们设置一个超级源点,那么问题就很简单了,超级源点连接
k
k
k个点,边权为
0
0
0,直接跑最短路即可。
I Yukino With Subinterval
题意
支持单点修改。
求子区间内的连续段个数,连续段指的是相同权值且尽可能长的段。
并且要求只计算连续段权值在
[
x
,
y
]
[x,y]
[x,y]中的子区间个数。
题解
不考虑修改的话,我们如何处理呢?
这是一个套路问题,我们只考虑连续段的最左边,只记录最左边的值。
比如:
3 3 3 4 5
我们记录的时候就是1 0 0 1 1
查询子区间的时候直接查和即可,但是这样子我们会发现显然是不对,因为在最左侧可能有贡献,但是它的最左侧不属于询问的子区间。
仔细考虑可以发现,只会有最左侧出现这样的情况,但其实最左侧是一定有一个贡献的。所以我们特判第一位是否符合权值的要求,符合就加一。
这样就变成了可以主席树或者离线树状数组可以做。
因为相当于求解:
a
≤
x
≤
b
,
c
≤
y
≤
d
a≤x≤b,c≤y≤d
a≤x≤b,c≤y≤d的子矩阵求和问题。
子矩阵求和问题都可以转换成二维前缀和求解二维偏序:
s
u
m
(
a
,
b
−
>
c
,
d
)
=
s
u
m
(
1
,
b
−
>
1
,
d
)
−
s
u
m
(
1
,
b
−
>
1
,
c
−
1
)
−
s
u
m
(
1
,
a
−
1
−
>
1
,
d
)
+
s
u
m
(
1
,
a
−
1
−
>
1
,
c
−
1
)
sum(a,b->c,d)=sum(1,b->1,d)-sum(1,b->1,c-1)-sum(1,a-1->1,d)+sum(1,a-1->1,c-1)
sum(a,b−>c,d)=sum(1,b−>1,d)−sum(1,b−>1,c−1)−sum(1,a−1−>1,d)+sum(1,a−1−>1,c−1)
这四个子问题都是可以离线树状数组去的,或者这题也可以暴力主席树。
但是再考虑带修,对于主席树,就是带修主席树(目前不会:树状数组套主席树)
从偏序角度就是三维偏序,在之前的基础上加上时间序(也就是修改顺序)
唯一要考虑的是带修时候要判断对连续段最左边的影响,我的做法是转换成改变前和改变后的差别来判断。
三维偏序可以
C
D
Q
CDQ
CDQ解决 没了。