P11952 [科大国创杯初中组 2023] 行走

题目描述

小可可和小多来到了一个网格图上进行最短路训练。 这是一个 $n \times n$ 的网格图,对于点 $(x, y)$,如果 $y < n$,则它向 $(x, y+1)$ 有一条有向边,边权为 $ea_{x,y}$;如果 $x < n$,则它向 $(x+1, y)$ 有一条有向边,边权为 $eb_{x,y}$。小可可需要在很短的时间内找到从 $(1,1)$ 到 $(n,n)$ 的最短路。 然而,小多会捣乱 $q$ 次:小雪会删去图中的一条边,然后小可可就需要重新计算 $(1,1)$ 到 $(n,n)$ 的最短路。当小可可计算完成后,小多就会恢复这条边。即:每次小多删掉的边只会影响到这一次小可可的计算。 小可可坚持尝试不借助外力,自己每次计算出答案。可惜小可可不是机器人,没过一会儿他就晕倒了。于是,计算最短路的任务就落到了你的头上。

输入格式

为避免过大的输入量,网格图边的边权将在程序内生成。 第一行两个正整数 $n,q$,表示网格的大小和小多捣乱的次数。 第二行两个整数 $seed$ 和 $B$,为辅助数据生成的变量。请保证它们为全局变量且 $seed$ 是 64 位无符号整形变量。 接下来按照从第一行到第 $n$ 行,第一列到第 $n-1$ 列的顺序生成 $ea_{i,j}$:每次生成时先调用一次 xorshift64(),再将 $ea_{i,j}$ 赋值为 $seed \& (2^B - 1)$。其中 $\&$ 表示二进制按位且运算,xorshift64() 的参考代码如下: ```cpp unsigned long long seed; int B; // xorshift64 算法,不能修改 unsigned long long xorshift64(){ seed ^= seed > 7; seed ^= seed 7; seed ^= seed > n >> q; cin >> seed >> B; vector ea(n+1, vector(n+1, 0)); // 横向边权:从 (i,j) 到 (i,j+1), j=1..n-1 vector eb(n+1, vector(n+1, 0)); // 纵向边权:从 (i,j) 到 (i+1,j), i=1..n-1 // 生成横向边权:遍历 i=1..n, j=1..n-1 for (int i = 1; i

输出格式

输出 $q$ 行,每行一个答案,表示删掉给定边后 $(1,1)$ 到 $(n,n)$ 的最短路。

说明/提示

### 数据规模与约定 对于 $20\%$ 的数据,满足 $n,q \leq 5, B = 1$; 对于 $40\%$ 的数据,满足 $n,q \leq 300$; 对于 $70\%$ 的数据,满足 $n \leq 300$; 对于 $100\%$ 的数据,有 $2 \leq n \leq 5000, 1 \leq q \leq 10^5, 1 \leq B \leq 30, 1 \leq x, y, x', y' \leq n$。