《如 何 速 通 一 套 题》5.1bug fixed

好吧,那天晚上才发现数据错了,只能咕一下了,现在咕完了

前情提要: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;
}
posted @ 2024-09-25 16:01  hhc0001  阅读(17)  评论(0)    收藏  举报