https://atcoder.jp/contests/abc232/tasks
G - Modulo Shortest Path
N 点 有向图
任意两点$i,j$, 有边$weight_{i\to j} = A_i+B_i \bmod M$
输出$i$到$N$的最短路
范围
n 2e5
m 1e9
3s
1024 mb
我的思路
说是有向, 实际上是两两联通,区别只是权重 $i \to j$ 是$A_i+B_j$, 而 $j\to i$是$A_j+ B_i$
n很大 不能可能枚举边,
但似乎, 1->a->b->c
如果忽略到mod, 边代价为= A1+Ba+Aa+Bb+Ab+Bc
也就是 A1+Bc+ (A+B)(a+b)
也就是(1->N) = 首项 + 末项 + 中间的AB
ans - (A1+Bn + (A+B)(…)) = 0 (mod M)
而注意到直接走, 就是$(A1+Bn)%M$, 所以已经存在一个[0,M)的答案, 所以最优的一定也是[0,M)内
如果 Bi 和前面的不超过M, Ai和后面的和不超过M
那么显然i只会让总代价增加(Ai+Bi), 因为可以去掉它,把前后拼起来
这里可以看出需要
(A0 + Bi)mod m + (Ai + B1) mod m < (A0 + B1) mod m < m
所以前面一定也是 [0,m)
(A0 + B1 + Ai + Bi) % m < (A0 + B1) % m < m
因此 (A0+B1+Ai+Bi) >=m, 而且这个减m 要在 上面求和的两个mod 中实现
((A0 + B1)%m + Ai + Bi) % m < (A0 + B1) % m < m
对于A0+B1 < m,
如果 Ai > A0 则Ai+B1 >= m, 如果Ai < A0, 则Bi > B1
如果 Bi > B1 则A0+Bi >= m, 如果Bi > B1, 则Ai > A0
对于2m > A0+B1 >= m
则 m - B1 <= Ai < A0, m - A0 <= Bi < B0
可以看成, 每次路径上插入一个点, 都是让总代价单调下降 (m - (ai+bi)%m)
初始$1 \to N$, 然后每次找一个去插入
但是点插入的顺序, 如何做?
按下降排序? , 前i个最大下降结果, 可是还会收到可插入的影响? 如何维护状态
另外就是这性质 有没有办法优化dij