T1:cookies/ZCC loves meat(meat)
ZCC终于打开了密码箱,发现里面只是一堆风干的肉条,于是他打算喂狗。
ZCC养了
n
n
n条狗,有
m
m
m根肉条,他想把肉条一根不留地分给狗,并使得每条狗至少有一条肉条可吃。狗总是很贪心,它们不希望看到有其他的狗有更多的肉条,否则就会不开心。一条狗的不开心程度可以表示为他的贪心程度和拥有比它更多肉条的狗的数量的乘积。现在ZCC想知道一种分配方式使得狗们的不开心程度的和最小。
首先会想到贪心,把狗分成两段,去最小值,但是显然不正确
然后就只能dp了
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示前
i
i
i只狗,花了
j
j
j根肉条的最小代价
若第
i
i
i个孩子的饼干
>
1
>1
>1,等价分配
j
−
i
j−i
j−i个饼干给前
i
i
i个孩子,相对顺序不变,怨气总和不变
若第
i
i
i个孩子只有一个饼干,那么枚举之前的多少孩子也获得一个饼干
f
[
i
]
[
j
]
=
min
(
f
[
i
]
[
j
−
i
]
,
min
k
=
1
i
f
[
k
]
[
j
−
i
+
k
]
+
k
∗
(
s
u
m
[
i
]
−
s
u
m
[
k
]
)
)
f[i][j]=\min (f[i][j-i],\min_{k=1}^{i}f[k][j-i+k]+k*(sum[i]-sum[k]) )
f[i][j]=min(f[i][j−i],mink=1if[k][j−i+k]+k∗(sum[i]−sum[k]))
T2:停不下来的团长奥尔加
奥尔加在一个长度为
n
+
1
n+1
n+1 的街道上跑着,初始,奥尔加在位置1 上,他想要跑到位置
n
+
1
n+1
n+1 去保护团员ride on。
空旷的大路上难免会有暗杀者,当奥尔加走到位置i 时,会有暗杀者出现,这时奥尔加只能回到
p
i
(
1
≤
p
i
≤
i
)
pi(1≤pi≤i)
pi(1≤pi≤i)位置上,但在下次到达i 的时候,暗杀者就不会出现(如果再到达i 还会有暗杀者),换言之,当奥尔加此时是第奇数次到达
i
i
i 的时候,下一步会走到
p
i
pi
pi,第偶数次到达
i
i
i 的时候,下一步走到
i
+
1
i+1
i+1(
n
+
1
n+1
n+1 位置上没有暗杀者)。
奥尔加每次移动都需要花费1 单位时间,停不下来的奥尔加只会一直跑,他想知道自己什么时候才能到达
n
+
1
n+1
n+1 位置,因为答案可能会很大,你只需要告诉他答案对
1000000007
(
1
0
9
+
7
)
1000000007(10^9+7)
1000000007(109+7)取模的结果就好了。
f
[
i
]
f[i]
f[i]表示第
i
i
i个点被经过了的次数
显然只有
j
>
i
j>i
j>i并且
p
[
j
]
<
i
p[j]<i
p[j]<i的点会对
i
i
i有影响
那么就转化为一个二维偏序问题,树状数组维护即可
T3:Lesson5!/Rally
转眼就Stage X 了,Stage X 的比赛路线可以看做一个n 个点m 条边的有向无环图,每条边长度都是1。杰洛·齐贝林会选择走最长的那一条路径。
迪亚哥·布兰度决定摧毁一个城市以及所有关于该城市的边,由于变成恐龙后脑子有点问题,他想要让摧毁后的Stage 最长路径最短,他想知道要摧毁哪个城市,及摧毁后最长路径的长度,如果有多个城市答案相同,则输出编号最小的那一个。
神犇Jarden的blog:https://blog.csdn.net/qq_32461955/article/details/83448447
看到DAG,很容易想到拓扑,但拓扑要怎么用才优秀就不知道了
根据题解,可以发现,根据拓扑序,对其他点有影响的只有它的出点和入点。
那么就将这个DAG分成两部分,
S
S
S和
T
T
T,分别和
1
,
n
1,n
1,n相连
先处理处点
u
u
u到
1
1
1和
n
n
n的距离
然后按拓扑序删点,每次删去经过
u
u
u的路径,统计最大值,然后再加上去就可以,用你喜欢的数据结构维护即可(建议线段树)