不是,近 5 年 NOI 从来没考过绿吧,不会吧?

形式化题面如下:

给定一个有向图,包含nn 个节点和mm 条有向边。边有长度。对于每个节点xx,其出边被编号为1dx1\to d_{x}dxd_{x} 是出边数量)。从11 号点出发,初始有一个变量p=1p=1,按以下规则移动:

  • 若当前位于节点xxpdxp\le d_{x},则走xx 的第pp 条边,移动到相邻节点yy。花费为边的长度。
  • 修改参数pp
    • p<kp<k,则令pp+1p\leftarrow p+1,花费为vpv_{p}
    • p>1p>1,则令pp1p\leftarrow p-1,花费为wpw_{p}

1i1\to i 的最小花费,若无法到达输出1-1

一眼分层图,题目转化为建kk 层的有向图,每次跳不同层要花费规则上指定的代价,求单源最短路跑 Dijkstra。但是空间复杂度是O(nk)O(nk),且时间复杂度为O(nklognk)O(nk\log nk),无法通过。

我们设分层图状态为(u,p)(u,p) 表示在第uu 点,参数为pp

考虑优化,首先一个关键观察就是当dx<pd_{x}<p 的时候是没有任何卵用的,(u,p)(u,p) 是无效状态。我们没必要建这么多图,考虑每一层就建dxd_x 层就可以啦。

接下来还有一个很难受的过程就是修改参数,考虑这个怎么优化,花费和pp 有关,一个不难观察到的地方每次增减量是11,考虑前缀和优化修改参数这一过程,这样复杂度从O(k)O(1)O(k)\to O(1)。这一部分我们可以通过 map 或哈希表实现,时间复杂度O(nlognlogk)O(nlogn)O(n \log n \log k)\to O(n \log n)

代码数据出来补一下?