好吧,那天晚上才发现数据错了,只能咕一下了,现在咕完了
前情提要:5.0
D 补幺梨
\(1 \le m \le 10^8\),\(1 \le n \le 10^7\),一看就不是背包。
那么,以背包的形式出现,但是不是背包,还能是什么呢?
同余最短路。只能是同余最短路。
然后由于 \(n\) 太大了,所以不同的值的数量估计不会很多,最大值估计不会很大,再加上数据随机,随便写写就过了...
然后数据出锅了。
#include <bits/stdc++.h>
#define int ll
using namespace std;
using ll = long long;
const int kInf = 0x3f3f3f3f3f3f3f3f;
struct node {
int x, v;
bool operator <(const node &b) const {
return (v == b.v? x < b.x : v < b.v);
}
};
int n, m, seed, a[10000010], ans;
vector<int> dis, vis;
set<node> st;
void dijkstra() {
st.insert({0, 0});
for(; st.size(); ) {
node tmp = *st.begin();
st.erase(st.begin());
vis[tmp.x] = 1;
for(int i = 2; i <= n; i++) {
int nv = (tmp.x + a[i]) % a[1], nw = tmp.v + a[i];
if(nw < dis[nv] && !vis[nv]) {
if(st.find({nv, dis[nv]}) != st.end()) {
st.erase(st.find({nv, dis[nv]}));
}
dis[nv] = nw;
st.insert({nv, dis[nv]});
}
}
}
}
signed main() {
freopen("pear.in", "r", stdin);
freopen("pear.out", "w", stdout);
cin >> n >> m >> seed;
mt19937 rng(seed);
auto get = [&]() {
uniform_int_distribution<int> qwq(2, m);
return qwq(rng);
};
for (int i = 1; i <= n; i++) {
a[i] = get();
}
sort(a + 1, a + n + 1);
n = unique(a + 1, a + n + 1) - a - 1;
dis.resize(a[1]), vis.resize(a[1]);
fill(dis.begin() + 1, dis.end(), 0x3f3f3f3f3f3f3f3f);
dijkstra();
for(auto i : dis) {
ans = max(ans, i - a[1]);
}
cout << ans << '\n';
return 0;
}
标签:5.1,le,int,long,st,vis,背包,fixed,bug
From: https://www.cnblogs.com/leavenothingafterblog/p/18431535/speedrun_v5-1bugfixed