Advertisement
pb_jiang

ABC372F WA

Sep 30th, 2024
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #ifndef __DEBUG__
  5. #define dbg(...) 42
  6. #endif
  7. template <class T>
  8. using mpq = priority_queue<T, vector<T>, greater<T>>;
  9.  
  10. using ll = long long;
  11. using pii = pair<int, int>;
  12. using pll = pair<ll, ll>;
  13. using vl = vector<ll>;
  14. using vi = vector<int>;
  15.  
  16. int main(int argc, char** argv)
  17. {
  18.     ll n, m, k;
  19.     cin >> n >> m >> k;
  20.     using a2l = array<ll, 2>;
  21.     vl ns { 1 };
  22.     vector<a2l> sc(m);
  23.     for (auto& v : sc)
  24.         cin >> v[0] >> v[1], ns.push_back(v[0]), ns.push_back(v[1]);
  25.  
  26.     sort(ns.begin(), ns.end());
  27.     ns.erase(std::unique(ns.begin(), ns.end()), ns.end());
  28.     ll sz = ns.size();
  29.     if (sz == 1) {
  30.         cout << 1 << '\n';
  31.         return 0;
  32.     }
  33.  
  34.     vector<vector<a2l>> g(sz);
  35.     for (auto& short_cut : sc) {
  36.         ll u = lower_bound(ns.begin(), ns.end(), short_cut[0]) - ns.begin(),
  37.            v = lower_bound(ns.begin(), ns.end(), short_cut[1]) - ns.begin();
  38.         // u -> v
  39.         if (v - u != 1)
  40.             g[u].push_back({ v, 1 });
  41.     }
  42.     for (ll i = 0; i < sz; ++i) {
  43.         ll u = i, v = (i + 1) % sz;
  44.         g[u].push_back({ v, (ns[v] - ns[u] + n) % n });
  45.     }
  46.     dbg(g);
  47.  
  48.     vector<vl> cache(sz, vl(k + 1, -1));
  49.  
  50.     constexpr ll mod = 998244353;
  51.     auto search = [&](auto&& self, ll u, ll remk) {
  52.         if (cache[u][remk] != -1)
  53.             return cache[u][remk];
  54.  
  55.         ll ret = 0;
  56.         for (auto [v, w] : g[u]) {
  57.             if (w >= remk)
  58.                 ret = (ret + 1) % mod;
  59.             else
  60.                 ret = (ret + self(self, v, remk - w)) % mod;
  61.         }
  62.         return cache[u][remk] = ret;
  63.     };
  64.  
  65.     cout << search(search, 0, k) << '\n';
  66.     ll ans = 0;
  67.     vector<vl> cnt(sz, vl(k + 1));
  68.     auto search2 = [&](ll u, ll remk) -> void {
  69.         priority_queue<a2l> pq;
  70.         pq.push({ remk, u });
  71.         cnt[u][remk] += 1;
  72.         while (!pq.empty()) {
  73.             auto [rk, u] = pq.top();
  74.             pq.pop();
  75.             for (auto [v, w] : g[u]) {
  76.                 if (rk <= w) {
  77.                     ans = (ans + cnt[u][rk]) % mod;
  78.                 } else {
  79.                     if (cnt[v][rk - w] == 0)
  80.                         pq.push({ rk - w, v });
  81.                     cnt[v][rk - w] = (cnt[v][rk - w] + cnt[u][rk]) % mod;
  82.                 }
  83.             }
  84.         }
  85.     };
  86.     // search2(0, k);
  87.     // cout << ans << '\n';
  88.     return 0;
  89. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement