日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[国家集训队]墨墨的等式

發(fā)布時間:2025/7/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [国家集训队]墨墨的等式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

想要寫論戰(zhàn)捆竹竿,看了題解學了一點姿勢,發(fā)現(xiàn)了一些奇怪的東西(我以前這道題寫的太菜了)

首先這道題可以轉(zhuǎn)化為模 \(A_i\) 最小值 \(m\) 意義下的最短路,求出每個模 \(m\) 意義下的值最少要多少代價可以達成,然后分別計算答案的貢獻。這個是經(jīng)典的同余最短路。

實際上,由于同余,邊的更新順序無關(guān)——也就是能分層更新。很像循環(huán)下標的背包,但是是取min的而不是方案數(shù)。證明的話把交換律和結(jié)合律的定義帶入即可。

因為順序無關(guān),考慮單獨更新每個權(quán)值。因為同余,把 \(0 \dots m - 1\) 的所有點按照模 \(A_i mod m\) 的值分類,對于點 \(i\) 能更新到 \(j\) 當且僅當 \(i \equiv j (mod A_i)\),因此,點被劃分成了一堆環(huán),環(huán)內(nèi)的分別處理。

對于一個環(huán),容易證明選擇距離最小的點開始更新是最優(yōu)的。因此從最小點開始,維護一個到當前點最小距離,線性掃過去即可。

復雜度 \(O(nm)\)

所以為什么那么多人都在寫最短路啊……為什么我還跑不過最短路啊……

#include <bits/stdc++.h>typedef long long LL; const int MAXN = 500010; int n; LL bmin, bmax, minn, f[MAXN]; int mn, A[MAXN];int main() {std::cin >> n >> bmin >> bmax; --bmin;mn = 1234567;for (int i = 1; i <= n; ++i)std::cin >> A[i], mn = std::min(mn, A[i]);memset(f, 0x3f, mn << 3);f[0] = 0;for (int i = 1; i <= n; ++i) {int mod = A[i] % mn;if (!mod) continue;static bool vis[MAXN];memset(vis, 0, mn);for (int j = 0; j < mn; ++j) if (!vis[j]) {int ma = j, now = j;while (!vis[now]) {vis[now] = true;if (f[now] < f[ma]) ma = now;now += mod - mn, now += now >> 31 & mn;}now = ma;LL vn = f[now];do {f[now] = std::min(f[now], vn);vn = std::min(vn, f[now]) + A[i];now += mod - mn, now += now >> 31 & mn;} while (now != ma);}}LL ans = 0;for (int i = 0; i < mn; ++i) {ans += f[i] <= bmax ? (bmax - f[i]) / mn + 1 : 0;ans -= f[i] <= bmin ? (bmin - f[i]) / mn + 1 : 0;}std::cout << ans << std::endl;return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/daklqw/p/11509518.html

總結(jié)

以上是生活随笔為你收集整理的[国家集训队]墨墨的等式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。