前置知识倍增https://oi-wiki.org/basic/binary-lifting/ $题目给出的是一个类似于内向基环树的图,根据对于每个i,w_{d_i}与w_i的关系可以建立一个边权图$假设x,y都是正数,那么对于每次询问的最大前缀和都是走完即可,$接下来就是处理负数对结局的影响.类似的我们可以利用倍增的思想额外去维护这个最大前缀和pre,前缀和就是sum,f_{(i,j)}代表第i$个点恰好走2j步,发现对于任意的区间l,r,f(l+r).sum=fl.sum+fr.sum 而最大前缀和有两种情况取max,从左边的序列 l 贡献 f(l+r).pre=max(f(l+r).pre,fl.pre)和从右边的序列r 贡献,因为必须是前缀需要加上左边序列的元素和 f(l+r).pre=max(fl.sum+fr.pre,f(l+r).pre)$接下来就可以在倍增数组上维护f_{(i,j)}了$
f(i+j).sum=f(i,j−1).sum+f(f(i,j−1),j−1).sum$$
在神秘的遗迹中隐藏着 n 块传送石碑,编号为 1 到 n。每块石碑 i 上刻有一个能量值 wi,并且刻有一个固定的目的地 di(1≤di≤n),表示从石碑 i 只会传送到石碑 di。
探险者可以站在一块石碑上,选择是否进行传送。每次传送时,设当前石碑为 i,目标石碑为 j=di:
注意 X 和 Y 可以是负数,表示能量减少。初始能量为 0,探险者可以在任意时刻选择停止,并且不必走完所有可能的步数。
现在有 q 次独立的询问,每次询问给定一个起始石碑 u 和一个最大传送次数 k。你需要回答:从石碑 u 出发,按照目的地序列连续传送,总步数不超过 k,所能获得的能量序列前缀和的最大值是多少(可以选择不走,此时收益为 0)。
输入保证 n 和 q 均不超过 2imes105,X 与 Y 的绝对值不超过 106,石碑能量值 wi 不超过 106,步数限制 k 不超过 109。
第一行输入四个整数 n,q,X,Y。 第二行输入 n 个整数 d1,d2,…,dn,表示每块石碑的目的地。 第三行输入 n 个整数 w1,w2,…,wn,表示每块石碑的能量值。 接下来 q 行,每行输入两个整数 u,k,代表一次询问的起始石碑编号和最大传送次数。
输出 q 行,每行一个整数,表示对应询问的最大能量收益(至少为 0)。
输入
4 4 2 1
2 3 4 1
1 2 3 4
1 1
1 2
1 3
4 2
输出
2
4
6
4
说明
石碑能量依次为 w=[1,2,3,4],目的地构成环 1o2o3o4o1。由于始终满足 wdi>wi,每一步收益均为 X=2。
1 1:走 1 步得到收益序列 [0,2],最大前缀和为 2。1 2:走 2 步得 [0,2,4],最大值为 4。1 3:走 3 步得 [0,2,4,6],最大值为 6。4 2:从 4 出发经 1 到 2,收益依次为 2,2,序列 [0,2,4],最大值 4。所有收益非负,走满 k 步即最优。输入
3 3 -5 3
2 3 1
10 5 8
1 2
1 3
2 1
输出
3
3
0
说明
n=3,能量 w=[10,5,8],目的地 d=[2,3,1]。X=−5,Y=3。
1 2:路径 1o2(w2=5≤10,收益 Y=3)再 2o3(w3=8>5,收益 X=−5)。累计能量序列 [0,3,−2],最大前缀和为 3。1 3:继续 3o1(w1=10>8,收益 −5),序列 [0,3,−2,−7],最大值仍为 3。2 1:从 2 走 1 步到 3,收益 −5,序列 [0,−5],最大值取 0(可以不传送)。输入
4 3 -2 3
2 3 4 1
1 10 5 20
1 4
1 3
2 1
输出
2
1
3
说明
X=−2,Y=3,w=[1,10,5,20],d=[2,3,4,1]。
1 4:走 4 步,依次 1o2(10>1,收益 −2),2o3(5≤10,收益 +3),3o4(20>5,收益 −2),4o1(1≤20,收益 +3)。累计序列 [0,−2,1,−1,2],最大前缀为 2。1 3:仅走前 3 步,序列 [0,−2,1,−1],最大值 1。2 1:从 2 走 1 步到 3,5≤10 得 +3,最大前缀为 3。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.