Submission #974136

# Submission time Handle Problem Language Result Execution time Memory
974136 2024-05-02T21:37:55 Z Ooops_sorry Harvest (JOI20_harvest) C++14
25 / 100
5000 ms 234308 KB
#include<iostream>
#include<deque>
#include<algorithm>
#include<vector>
#include<map>
#include<random>
#include<time.h>
#include<cassert>
#include<chrono>
#include<set>
#include<unordered_set>
#include<array>
 
using namespace std;
 
#define ull unsigned long long
#define pb push_back
#define ld long double
#define ll long long
#define all(a) a.begin(), a.end()
#define int long long 
 
mt19937_64 rnd(51);
 
struct SegTree {
  vector<ll> t;
  SegTree(int n) {
    t.resize(4 * n);
  }
  void update(int v, int l, int r, int pos, ll val) {
    if (l == r) {
      t[v] += val;
      return;
    }
    int m = (l + r) / 2;
    if (pos <= m) {
      update(2 * v, l, m, pos, val);
    } else {
      update(2 * v + 1, m + 1, r, pos, val);
    }
    t[v] = t[v * 2] + t[v * 2 + 1];
  }
  ll get(int v, int tl, int tr, int l, int r) {
    if (l > r) return 0;
    if (tl == l && tr == r) {
      return t[v];
    }
    int tm = (tl + tr) / 2;
    return get(2 * v, tl, tm, l, min(r, tm)) + get(2 * v + 1, tm + 1, tr, max(l, tm + 1), r);
  }
};
 
const int N = 2e5 + 10;
vector<int> mas[N];
 
vector<pair<int, int>> g[N];
bool on_cycle[N];
pair<int, int> go[N];
 
ll ans[N];
ll dep[N], sz[N];
vector<pair<ll, int>> query[N];

SegTree Tree(N);
vector<ll> dif;
 
void zhfs(int v) {
  for (auto i : mas[v]) {
    dif.pb(i + dep[v]);
  }
  sz[v] = mas[v].size();
  for (auto [u, c] : g[v]) {
    if (!on_cycle[u]) {
      dep[u] = dep[v] + c;
      zhfs(u);
      sz[v] += sz[u];
    }
  }
}
 
vector<ll> st[N];

void dfs(int v) {
  int best = -1;
  for (auto [u, c] : g[v]) {
    if (!on_cycle[u]) {
      if (best == -1 || sz[u] > sz[best]) {
        best = u;
      }
    }
  }
  for (auto [u, c] : g[v]) {
    if (!on_cycle[u] && best != u) {
      dfs(u);
      for (auto i : st[u]) {
        int j = lower_bound(all(dif), i) - dif.begin();
        Tree.update(1, 0, N - 1, j, -1);
      }
      //assert(Tree.get(1, 0, N - 1, 0, N - 1) == 0);
    }
  }
  if (best != -1) {
    dfs(best);
    swap(st[v], st[best]);
  }
  for (auto i : mas[v]) {
    int j = lower_bound(all(dif), i + dep[v]) - dif.begin();
    Tree.update(1, 0, N - 1, j, 1);
    st[v].pb(i + dep[v]);
  }
  for (auto [u, c] : g[v]) {
    if (!on_cycle[u]) {
      for (int i : st[u]) {
        st[v].pb(i);
      }
    }
  }
  if (!on_cycle[v]) {
    for (auto [t, i] : query[v]) {
      for (auto val : st[v]) {
        if (val - dep[v] <= t) {
          ans[i]++;
        }
      }
      //int j = upper_bound(all(dif), t + dep[v]) - dif.begin() - 1;
      //ans[i] += Tree.get(1, 0, N - 1, 0, j);
    }
  }
}
 
signed main() {
#ifdef LOCAL
  freopen("input.txt", "r", stdin);
#endif // LOCAL
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, l, c;
  cin >> n >> m >> l >> c;
  int left = (c / l) * l;
  c %= l;
  vector<int> a(n), b(m);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 0; i < m; i++) {
    cin >> b[i];
  }
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int v;
    ll t;
    cin >> v >> t;
    v--;
    query[v].pb({t, i});
  }
  int j = 0;
  while (j < b.size() && b[j] < a[0]) {
    mas[n - 1].pb(b[j] + l - a[n - 1]);
    j++;
  }
  for (int i = 0; i < n; i++) {
    while (j < b.size() && (i == n - 1 || a[i + 1] > b[j])) {
      mas[i].pb(b[j] - a[i]);
      j++;
    }
  } 
  assert(j == b.size());
  for (int i = 0; i < n; i++) {
    a.pb(a[i] + l);
  }
  j = 0;
  for (int i = n; i < 2 * n; i++) {
    while (j + 1 < 2 * n && a[i] - a[j + 1] >= c) {
      j++;
    } 
    go[i % n] = {j % n, a[i] - a[j] + left};
    g[j % n].pb({i % n, a[i] - a[j] + left});
  }
  vector<bool> used(n);
  vector<deque<int>> cycles;
  for (int i = 0; i < n; i++) {
    if (!used[i]) {
      int j = i;
      map<int, int> here;
      deque<int> arr;
      while (!used[j]) {
        used[j] = 1;
        here[j] = 1;
        arr.pb(j);
        j = go[j].first;
      }
      if (here[j]) {
        while (arr.front() != j) {
          arr.pop_front();
        }
        cycles.pb(arr);
        for (int v : arr) {
          on_cycle[v] = 1;
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (on_cycle[i]) {
      dif.clear();
      zhfs(i);
      sort(all(dif));
      dif.erase(unique(all(dif)), dif.end());
      dfs(i);
      for (int val : st[i]) {
        int j = lower_bound(all(dif), val) - dif.begin();
        Tree.update(1, 0, N - 1, j, -1);
      }
    }
  }
  for (auto cycle : cycles) {
    int sz = cycle.size();
    vector<ll> pr(sz + 1);
    for (int i = 0; i < sz; i++) {
      int u = cycle[i], v = cycle[(i + 1) % sz];
      pr[i + 1] = pr[i] + go[u].second;
    }
    vector<ll> u, rem;
    map<ll, vector<pair<int, int>>> mp;
    for (int i = 0; i < sz; i++) {
      int v = cycle[i];
      for (auto val : st[v]) {
        u.pb(val - pr[i]);
        rem.pb((val + pr.back() - pr[i]) % pr.back());
      }
      for (auto [t, ind] : query[v]) {
        mp[t - pr[i]].pb({ind, i});
      }
    }
    sort(all(u));
    sort(all(rem));
    rem.erase(unique(all(rem)), rem.end());
    int sz2 = rem.size();
    SegTree cnt2(sz2);
    int ind = 0;
    ll sum = 0;
    for (auto [t, arr] : mp) {
      while (ind < u.size() && u[ind] <= t) {
        sum += (u[ind] + pr.back()) / pr.back();
        int k = lower_bound(all(rem), (u[ind] + pr.back()) % pr.back()) - rem.begin();
        assert(rem[k] == (u[ind] + pr.back()) % pr.back());
        cnt2.update(1, 0, sz2 - 1, k, 1);
        ind++;
      }
      for (auto [pos, i] : arr) {
        int real_t = t + pr[i];
        int pos1 = upper_bound(all(rem), (real_t % pr.back()) - pr[i]) - rem.begin() - 1;
        int pos2 = lower_bound(all(rem), pr.back() - pr[i]) - rem.begin();
        ans[pos] += ind * (real_t / pr.back()) - sum;
        ans[pos] -= cnt2.get(1, 0, sz2 - 1, pos2, sz2 - 1);
        ans[pos] += cnt2.get(1, 0, sz2 - 1, 0, pos1);
        int pos3 = upper_bound(all(rem), real_t % pr.back() + pr.back() - pr[i]) - rem.begin() - 1;
        if (0 <= pos2 && pos2 <= pos3 && pos2 < sz2) {
          ans[pos] += cnt2.get(1, 0, sz2 - 1, pos2, pos3);
        }
      }
    }
    int sz1 = u.size();
    SegTree tr(sz1);
    for (int i = 0; i < sz; i++) {
      int v = cycle[i];
      for (auto val : st[v]) {
        int j = lower_bound(all(u), val - pr[i]) - u.begin();
        tr.update(1, 0, sz1 - 1, j, 1);
      }
      for (auto [t, ind] : query[v]) {
        int k = upper_bound(all(u), t - pr[i]) - u.begin() - 1;
        ans[ind] += tr.get(1, 0, sz1 - 1, 0, k);
      }
    }
  }
  for (int i = 0; i < q; i++) {
    cout << ans[i] << endl;
  }
  return 0; 
}

Compilation message

harvest.cpp: In function 'void zhfs(long long int)':
harvest.cpp:72:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   72 |   for (auto [u, c] : g[v]) {
      |             ^
harvest.cpp: In function 'void dfs(long long int)':
harvest.cpp:85:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   85 |   for (auto [u, c] : g[v]) {
      |             ^
harvest.cpp:92:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   92 |   for (auto [u, c] : g[v]) {
      |             ^
harvest.cpp:111:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  111 |   for (auto [u, c] : g[v]) {
      |             ^
harvest.cpp:119:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  119 |     for (auto [t, i] : query[v]) {
      |               ^
harvest.cpp: In function 'int main()':
harvest.cpp:158:12: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  158 |   while (j < b.size() && b[j] < a[0]) {
      |          ~~^~~~~~~~~~
harvest.cpp:163:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  163 |     while (j < b.size() && (i == n - 1 || a[i + 1] > b[j])) {
      |            ~~^~~~~~~~~~
In file included from /usr/include/c++/10/cassert:44,
                 from harvest.cpp:8:
harvest.cpp:168:12: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  168 |   assert(j == b.size());
      |          ~~^~~~~~~~~~~
harvest.cpp:221:25: warning: unused variable 'v' [-Wunused-variable]
  221 |       int u = cycle[i], v = cycle[(i + 1) % sz];
      |                         ^
harvest.cpp:232:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  232 |       for (auto [t, ind] : query[v]) {
      |                 ^
harvest.cpp:243:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  243 |     for (auto [t, arr] : mp) {
      |               ^
harvest.cpp:244:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  244 |       while (ind < u.size() && u[ind] <= t) {
      |              ~~~~^~~~~~~~~~
harvest.cpp:251:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  251 |       for (auto [pos, i] : arr) {
      |                 ^
harvest.cpp:272:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  272 |       for (auto [t, ind] : query[v]) {
      |                 ^
# Verdict Execution time Memory Grader output
1 Correct 20 ms 29788 KB Output is correct
2 Correct 16 ms 31796 KB Output is correct
3 Correct 15 ms 32180 KB Output is correct
4 Correct 17 ms 30044 KB Output is correct
5 Correct 17 ms 30556 KB Output is correct
6 Correct 19 ms 30552 KB Output is correct
7 Correct 22 ms 30536 KB Output is correct
8 Correct 13 ms 29968 KB Output is correct
9 Correct 14 ms 30044 KB Output is correct
10 Correct 14 ms 30044 KB Output is correct
11 Correct 13 ms 30044 KB Output is correct
12 Correct 14 ms 30300 KB Output is correct
13 Correct 15 ms 30300 KB Output is correct
14 Correct 15 ms 30000 KB Output is correct
15 Correct 16 ms 30404 KB Output is correct
16 Correct 16 ms 30288 KB Output is correct
17 Correct 16 ms 30300 KB Output is correct
18 Correct 15 ms 30300 KB Output is correct
19 Correct 15 ms 30300 KB Output is correct
20 Correct 15 ms 30352 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 480 ms 58672 KB Output is correct
2 Correct 363 ms 49180 KB Output is correct
3 Correct 495 ms 183872 KB Output is correct
4 Correct 653 ms 206472 KB Output is correct
5 Correct 569 ms 91444 KB Output is correct
6 Correct 792 ms 91612 KB Output is correct
7 Correct 332 ms 48176 KB Output is correct
8 Correct 347 ms 47844 KB Output is correct
9 Correct 655 ms 76564 KB Output is correct
10 Correct 504 ms 74236 KB Output is correct
11 Correct 794 ms 75504 KB Output is correct
12 Correct 727 ms 75916 KB Output is correct
13 Correct 781 ms 75704 KB Output is correct
14 Correct 536 ms 73524 KB Output is correct
15 Correct 587 ms 63900 KB Output is correct
16 Correct 496 ms 67372 KB Output is correct
17 Correct 569 ms 67092 KB Output is correct
18 Correct 405 ms 44232 KB Output is correct
19 Correct 482 ms 43760 KB Output is correct
20 Correct 356 ms 49936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 29788 KB Output is correct
2 Correct 16 ms 31796 KB Output is correct
3 Correct 15 ms 32180 KB Output is correct
4 Correct 17 ms 30044 KB Output is correct
5 Correct 17 ms 30556 KB Output is correct
6 Correct 19 ms 30552 KB Output is correct
7 Correct 22 ms 30536 KB Output is correct
8 Correct 13 ms 29968 KB Output is correct
9 Correct 14 ms 30044 KB Output is correct
10 Correct 14 ms 30044 KB Output is correct
11 Correct 13 ms 30044 KB Output is correct
12 Correct 14 ms 30300 KB Output is correct
13 Correct 15 ms 30300 KB Output is correct
14 Correct 15 ms 30000 KB Output is correct
15 Correct 16 ms 30404 KB Output is correct
16 Correct 16 ms 30288 KB Output is correct
17 Correct 16 ms 30300 KB Output is correct
18 Correct 15 ms 30300 KB Output is correct
19 Correct 15 ms 30300 KB Output is correct
20 Correct 15 ms 30352 KB Output is correct
21 Correct 480 ms 58672 KB Output is correct
22 Correct 363 ms 49180 KB Output is correct
23 Correct 495 ms 183872 KB Output is correct
24 Correct 653 ms 206472 KB Output is correct
25 Correct 569 ms 91444 KB Output is correct
26 Correct 792 ms 91612 KB Output is correct
27 Correct 332 ms 48176 KB Output is correct
28 Correct 347 ms 47844 KB Output is correct
29 Correct 655 ms 76564 KB Output is correct
30 Correct 504 ms 74236 KB Output is correct
31 Correct 794 ms 75504 KB Output is correct
32 Correct 727 ms 75916 KB Output is correct
33 Correct 781 ms 75704 KB Output is correct
34 Correct 536 ms 73524 KB Output is correct
35 Correct 587 ms 63900 KB Output is correct
36 Correct 496 ms 67372 KB Output is correct
37 Correct 569 ms 67092 KB Output is correct
38 Correct 405 ms 44232 KB Output is correct
39 Correct 482 ms 43760 KB Output is correct
40 Correct 356 ms 49936 KB Output is correct
41 Correct 745 ms 85572 KB Output is correct
42 Correct 529 ms 197868 KB Output is correct
43 Correct 626 ms 210188 KB Output is correct
44 Correct 843 ms 234308 KB Output is correct
45 Execution timed out 5016 ms 102604 KB Time limit exceeded
46 Halted 0 ms 0 KB -