NOI Online 1 入門組 魔法

2022-04-29 05:51:11 字數 1348 閱讀 6384

全網都是矩陣快速冪,我只會倍增dp

其實這題與 acwing 345. 牛站 還是比較像的,那題可以矩陣快速冪 / 倍增,這題也行。

先 \(floyd\) 預處理兩點之間不用魔法最短距離 \(d_\) 複雜度 \(o(n^3)\)

然後預處理兩點之間至多用乙個魔法的最短距離 \(w_\),初始為 \(w_ = d_\),列舉 \(i, j\) 和一條邊 \((u, v, t)\)

\(w_ = \min(d[i][u] - t + d[v][j])\),複雜度 \(o(n^2m)\)

然後把 \(w\) 陣列當做鄰接矩陣的新圖,所以問題變成了走恰好 \(k\) 條邊的最短路(可以理解多走不會變差,因為滿足 \(w_ <= 0\)),這個問題就是 acwing 345. 牛站 ,具體做法看 acwing 345. 牛站的倍增 dp 思路,複雜度 \(o(n^3 \log k)\)

注意細節,走 \(0\) 條邊的最短路是 \(d_\),注意 \(f\) 的初始值。

#include #include #include #include using namespace std;

typedef long long ll;

const int n = 105, m = 2505, l = 20;

const ll inf = 1e18;

int n, m, k, l;

ll d[n][n], w[n][n], g[l][n][n], f[n], t[n];

struct e e[m];

int main()

for (int k = 1; k <= n; k++)

for (int i = 1; i <= n; i++)

for (int j = 1; j <= n; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);

for (int i = 1; i <= n; i++)

} for (int c = 1; c <= l; c++)

for (int i = 1; i <= n; i++)

for (int j = 1; j <= n; j++)

for (int k = 1; k <= n; k++)

g[c][i][j] = min(g[c][i][j], g[c - 1][i][k] + g[c - 1][k][j]);

for (int i = 1; i <= n; i++) f[i] = d[1][i];

for (int c = 0; c <= l; c++)

} printf("%lld\n", f[n]);

return 0;

}

NOI Online 1 入門組 文具訂購

description 小明的班上共有 n 元班費,同學們準備使用班費集體購買 3 種物品 圓規,每個 7 元。筆,每支 4 元。筆記本,每本 3 元。小明負責訂購文具,設圓規,筆,筆記本的訂購數量分別為 a,b,c,他訂購的原則依次如下 n元錢必須正好用光,即 7a 4b 3c n。在滿足以上條件...

NOI Online 1 提高組 序列

luogu p6185 noi online 1 序列 將其轉化為圖論題。定義 u,v 為 a i 所代表的點 u v 為 b i 所代表的點 對於操作 2 將其視為一種權值搬運的操作,從 u 到 v 或者反過來轉移點權。那麼我們對 u,v 和 u v 連一條無向邊,顯然對於乙個連通塊內的所有點都可...

NOI Online 1 提高組 氣泡排序

這個題很繞,記數字i前面有cns i 個數字比他大,逆序對個數就是sigmi cns i 反轉k次就是讓cns i k i 1 i n 而且cns i 不能有負數 利用兩個線段樹維護一下,就是有點繞。include include include include includeusing names...