답안 #937059

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
937059 2024-03-03T10:22:29 Z rxlfd314 새 집 (APIO18_new_home) C++17
47 / 100
5000 ms 282752 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
using namespace std;
using ari2 = array<int, 2>;
using ari3 = array<int, 3>;
using ari4 = array<int, 4>;
 
#define vt vector
#define size(x) (int((x).size()))
#define all(x) begin(x), end(x)
 
#define REP(a, b, c, d) for (int a = (b); (d) > 0 ? a <= (c) : a >= (c); a += (d))
#define FOR(a, b, c) REP(a, b, c, 1)
#define ROF(a, b, c) REP(a, b, c, -1)
 
constexpr int mxN = 300000;
int N, K, Q;
vt<int> cmp;
 
struct ST {
  priority_queue<int> st[mxN<<1], die[mxN<<1];
  void kill(int i) {
    while (size(st[i]) && size(die[i]) && st[i].top() == die[i].top())
      st[i].pop(), die[i].pop();
  }
  void insert(int ql, int qr, int v) {
    for (ql += size(cmp), qr += size(cmp) + 1; ql < qr; ql >>= 1, qr >>= 1) {
      kill(ql);
      kill(qr);
      if (ql & 1)
        st[ql++].push(v), kill(ql-1);
      if (qr & 1)
        st[--qr].push(v), kill(qr);
    }
  }
  void erase(int ql, int qr, int v) {
    for (ql += size(cmp), qr += size(cmp) + 1; ql < qr; ql >>= 1, qr >>= 1) {
      kill(ql);
      kill(qr);
      if (ql & 1)
        die[ql++].push(v), kill(ql-1);
      if (qr & 1)
        die[--qr].push(v), kill(qr);
    }
  }
  int qry(int i) {
    int res = INT_MIN;
    for (i += size(cmp); i > 0; i >>= 1)
      kill(i), res = max(res, size(st[i]) ? st[i].top() : res);
    return res;
  }
} st_left, st_right;

signed main() {
#ifndef DEBUG
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
#endif
  cin >> N >> K >> Q;
  vt<ari4> events;
  FOR(i, 0, N-1) {
    int x, t, a, b;
    cin >> x >> t >> a >> b, t--;
    events.push_back({a, 0, x, t}); // time, (0 = insert, 1 = remove, 2 = is year), location, type
    events.push_back({b+1, 1, x, t});
  }
  FOR(i, 0, Q-1) {
    int year, x;
    cin >> x >> year;
    events.push_back({year, 2, x, i}); // time, is year, location, query index
    cmp.push_back(x);
  }
  sort(all(cmp));
  cmp.erase(unique(all(cmp)), end(cmp));
  sort(all(events));

  auto ind = [&](int v) {
    return lower_bound(all(cmp), v) - begin(cmp);
  };
  auto erase = [&](int l, int r) {
    assert(l + r + 1 >= 0);
    int m = l + r + 1 >> 1;
    int li = ind(l), ri = ind(r), mi = ind(m);
    ri -= cmp[ri] > r;
    if (mi - 1 >= li)
      st_left.erase(li, mi-1, -l); 
    if (ri >= mi)
      st_right.erase(mi, ri, r);
  };
  auto insert = [&](int l, int r) {
    assert(l + r + 1 >= 0);
    int m = l + r + 1 >> 1;
    int li = ind(l), ri = ind(r), mi = ind(m);
    ri -= cmp[ri] > r;
    if (mi - 1 >= li)
      st_left.insert(li, mi-1, -l);
    if (ri >= mi)
      st_right.insert(mi, ri, r);
  };

  vt<int> ans(Q), present(K);
  vt<map<int, int>> positions(K);
  int present_cnt = 0;
  for (auto &[t, is_query, x, type] : events) {
    if (is_query == 2) {
      if (present_cnt < K) {
        ans[type] = -1;
        continue;
      }
      int i = ind(x);
      int l = st_left.qry(i);
      if (l != INT_MIN)
        l = -l;
      else
        l = x;
      int r = st_right.qry(i);
      l = min(l, x);
      r = max(r, x);
      ans[type] = max(r - x, x - l);
#ifdef DEBUG
      cout << "at time " << t << " answer for " << x << " is:\n";
      cout << "L: " << l << '\n';
      cout << "R: " << r << '\n';
#endif
    } else if (is_query) {
      auto &xs = positions[type];
      if (xs[x] == 1) {
        auto it = xs.find(x);
        int l = it != begin(xs) ? prev(it)->first : -1;
        int r = next(it) != end(xs) ? next(it)->first : INT_MAX;
        xs.erase(it);
        if (l >= 0)
          erase(l, x);
        else
          erase(-x, x);
        if (r < INT_MAX)
          erase(x, r); 
        else
          erase(x, INT_MAX - x - 1);

        if (l >= 0 && r < INT_MAX)
          insert(l, r);
        else if (l >= 0)
          insert(l, INT_MAX - l - 1);
        else if (r < INT_MAX)
          insert(-r, r);
      } else {
        xs[x]--;
      }
      present_cnt -= --present[type] == 0;
    } else {
      auto &xs = positions[type];
      if (xs[x])
        xs[x]++;
      else {
        xs[x] = 1;
        auto it = xs.find(x);
        int l = it != begin(xs) ? prev(it)->first : -1;
        int r = next(it) != end(xs) ? next(it)->first : INT_MAX;
        if (l >= 0 && r < INT_MAX)
          erase(l, r);
        else if (l >= 0)
          erase(l, INT_MAX - l - 1);
        else if (r < INT_MAX)
          erase(-r, r);

        if (l >= 0)
          insert(l, x);
        else
          insert(-x, x);
        if (r < INT_MAX)
          insert(x, r);
        else
          insert(x, INT_MAX - x - 1);
      }
      present_cnt += ++present[type] == 1;
    }
  }

  for (int &i : ans)
    cout << i << '\n';
}

Compilation message

new_home.cpp: In lambda function:
new_home.cpp:83:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   83 |     int m = l + r + 1 >> 1;
      |             ~~~~~~^~~
new_home.cpp: In lambda function:
new_home.cpp:93:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   93 |     int m = l + r + 1 >> 1;
      |             ~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 75352 KB Output is correct
2 Correct 21 ms 75600 KB Output is correct
3 Correct 21 ms 75608 KB Output is correct
4 Correct 20 ms 75604 KB Output is correct
5 Correct 21 ms 75448 KB Output is correct
6 Correct 24 ms 75612 KB Output is correct
7 Correct 22 ms 75612 KB Output is correct
8 Correct 23 ms 75612 KB Output is correct
9 Correct 23 ms 75608 KB Output is correct
10 Correct 23 ms 75612 KB Output is correct
11 Correct 22 ms 75612 KB Output is correct
12 Correct 23 ms 75672 KB Output is correct
13 Correct 22 ms 75612 KB Output is correct
14 Correct 21 ms 75612 KB Output is correct
15 Correct 21 ms 75532 KB Output is correct
16 Correct 23 ms 75516 KB Output is correct
17 Correct 22 ms 75612 KB Output is correct
18 Correct 22 ms 75612 KB Output is correct
19 Correct 22 ms 75756 KB Output is correct
20 Correct 21 ms 75612 KB Output is correct
21 Correct 22 ms 75612 KB Output is correct
22 Correct 21 ms 75708 KB Output is correct
23 Correct 23 ms 75612 KB Output is correct
24 Correct 23 ms 75792 KB Output is correct
25 Correct 22 ms 75612 KB Output is correct
26 Correct 24 ms 75612 KB Output is correct
27 Correct 22 ms 75612 KB Output is correct
28 Correct 21 ms 75608 KB Output is correct
29 Correct 20 ms 75612 KB Output is correct
30 Correct 22 ms 75656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 75352 KB Output is correct
2 Correct 21 ms 75600 KB Output is correct
3 Correct 21 ms 75608 KB Output is correct
4 Correct 20 ms 75604 KB Output is correct
5 Correct 21 ms 75448 KB Output is correct
6 Correct 24 ms 75612 KB Output is correct
7 Correct 22 ms 75612 KB Output is correct
8 Correct 23 ms 75612 KB Output is correct
9 Correct 23 ms 75608 KB Output is correct
10 Correct 23 ms 75612 KB Output is correct
11 Correct 22 ms 75612 KB Output is correct
12 Correct 23 ms 75672 KB Output is correct
13 Correct 22 ms 75612 KB Output is correct
14 Correct 21 ms 75612 KB Output is correct
15 Correct 21 ms 75532 KB Output is correct
16 Correct 23 ms 75516 KB Output is correct
17 Correct 22 ms 75612 KB Output is correct
18 Correct 22 ms 75612 KB Output is correct
19 Correct 22 ms 75756 KB Output is correct
20 Correct 21 ms 75612 KB Output is correct
21 Correct 22 ms 75612 KB Output is correct
22 Correct 21 ms 75708 KB Output is correct
23 Correct 23 ms 75612 KB Output is correct
24 Correct 23 ms 75792 KB Output is correct
25 Correct 22 ms 75612 KB Output is correct
26 Correct 24 ms 75612 KB Output is correct
27 Correct 22 ms 75612 KB Output is correct
28 Correct 21 ms 75608 KB Output is correct
29 Correct 20 ms 75612 KB Output is correct
30 Correct 22 ms 75656 KB Output is correct
31 Correct 1293 ms 113060 KB Output is correct
32 Correct 69 ms 81352 KB Output is correct
33 Correct 652 ms 94032 KB Output is correct
34 Correct 1301 ms 110288 KB Output is correct
35 Correct 1079 ms 106276 KB Output is correct
36 Correct 688 ms 95424 KB Output is correct
37 Correct 501 ms 95420 KB Output is correct
38 Correct 369 ms 92492 KB Output is correct
39 Correct 336 ms 92856 KB Output is correct
40 Correct 300 ms 93192 KB Output is correct
41 Correct 845 ms 101404 KB Output is correct
42 Correct 872 ms 102596 KB Output is correct
43 Correct 70 ms 81868 KB Output is correct
44 Correct 821 ms 100284 KB Output is correct
45 Correct 720 ms 97476 KB Output is correct
46 Correct 595 ms 92108 KB Output is correct
47 Correct 347 ms 91380 KB Output is correct
48 Correct 302 ms 90528 KB Output is correct
49 Correct 426 ms 92948 KB Output is correct
50 Correct 558 ms 98992 KB Output is correct
51 Correct 420 ms 91584 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5094 ms 282752 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5107 ms 264852 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 75352 KB Output is correct
2 Correct 21 ms 75600 KB Output is correct
3 Correct 21 ms 75608 KB Output is correct
4 Correct 20 ms 75604 KB Output is correct
5 Correct 21 ms 75448 KB Output is correct
6 Correct 24 ms 75612 KB Output is correct
7 Correct 22 ms 75612 KB Output is correct
8 Correct 23 ms 75612 KB Output is correct
9 Correct 23 ms 75608 KB Output is correct
10 Correct 23 ms 75612 KB Output is correct
11 Correct 22 ms 75612 KB Output is correct
12 Correct 23 ms 75672 KB Output is correct
13 Correct 22 ms 75612 KB Output is correct
14 Correct 21 ms 75612 KB Output is correct
15 Correct 21 ms 75532 KB Output is correct
16 Correct 23 ms 75516 KB Output is correct
17 Correct 22 ms 75612 KB Output is correct
18 Correct 22 ms 75612 KB Output is correct
19 Correct 22 ms 75756 KB Output is correct
20 Correct 21 ms 75612 KB Output is correct
21 Correct 22 ms 75612 KB Output is correct
22 Correct 21 ms 75708 KB Output is correct
23 Correct 23 ms 75612 KB Output is correct
24 Correct 23 ms 75792 KB Output is correct
25 Correct 22 ms 75612 KB Output is correct
26 Correct 24 ms 75612 KB Output is correct
27 Correct 22 ms 75612 KB Output is correct
28 Correct 21 ms 75608 KB Output is correct
29 Correct 20 ms 75612 KB Output is correct
30 Correct 22 ms 75656 KB Output is correct
31 Correct 1293 ms 113060 KB Output is correct
32 Correct 69 ms 81352 KB Output is correct
33 Correct 652 ms 94032 KB Output is correct
34 Correct 1301 ms 110288 KB Output is correct
35 Correct 1079 ms 106276 KB Output is correct
36 Correct 688 ms 95424 KB Output is correct
37 Correct 501 ms 95420 KB Output is correct
38 Correct 369 ms 92492 KB Output is correct
39 Correct 336 ms 92856 KB Output is correct
40 Correct 300 ms 93192 KB Output is correct
41 Correct 845 ms 101404 KB Output is correct
42 Correct 872 ms 102596 KB Output is correct
43 Correct 70 ms 81868 KB Output is correct
44 Correct 821 ms 100284 KB Output is correct
45 Correct 720 ms 97476 KB Output is correct
46 Correct 595 ms 92108 KB Output is correct
47 Correct 347 ms 91380 KB Output is correct
48 Correct 302 ms 90528 KB Output is correct
49 Correct 426 ms 92948 KB Output is correct
50 Correct 558 ms 98992 KB Output is correct
51 Correct 420 ms 91584 KB Output is correct
52 Correct 601 ms 103288 KB Output is correct
53 Correct 571 ms 100804 KB Output is correct
54 Correct 1092 ms 115052 KB Output is correct
55 Correct 841 ms 105684 KB Output is correct
56 Correct 741 ms 106732 KB Output is correct
57 Correct 862 ms 103980 KB Output is correct
58 Correct 847 ms 104620 KB Output is correct
59 Correct 764 ms 106172 KB Output is correct
60 Correct 920 ms 104264 KB Output is correct
61 Correct 81 ms 86072 KB Output is correct
62 Correct 643 ms 104644 KB Output is correct
63 Correct 894 ms 112452 KB Output is correct
64 Correct 1010 ms 113180 KB Output is correct
65 Correct 1089 ms 111704 KB Output is correct
66 Correct 988 ms 102816 KB Output is correct
67 Correct 231 ms 88044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 75352 KB Output is correct
2 Correct 21 ms 75600 KB Output is correct
3 Correct 21 ms 75608 KB Output is correct
4 Correct 20 ms 75604 KB Output is correct
5 Correct 21 ms 75448 KB Output is correct
6 Correct 24 ms 75612 KB Output is correct
7 Correct 22 ms 75612 KB Output is correct
8 Correct 23 ms 75612 KB Output is correct
9 Correct 23 ms 75608 KB Output is correct
10 Correct 23 ms 75612 KB Output is correct
11 Correct 22 ms 75612 KB Output is correct
12 Correct 23 ms 75672 KB Output is correct
13 Correct 22 ms 75612 KB Output is correct
14 Correct 21 ms 75612 KB Output is correct
15 Correct 21 ms 75532 KB Output is correct
16 Correct 23 ms 75516 KB Output is correct
17 Correct 22 ms 75612 KB Output is correct
18 Correct 22 ms 75612 KB Output is correct
19 Correct 22 ms 75756 KB Output is correct
20 Correct 21 ms 75612 KB Output is correct
21 Correct 22 ms 75612 KB Output is correct
22 Correct 21 ms 75708 KB Output is correct
23 Correct 23 ms 75612 KB Output is correct
24 Correct 23 ms 75792 KB Output is correct
25 Correct 22 ms 75612 KB Output is correct
26 Correct 24 ms 75612 KB Output is correct
27 Correct 22 ms 75612 KB Output is correct
28 Correct 21 ms 75608 KB Output is correct
29 Correct 20 ms 75612 KB Output is correct
30 Correct 22 ms 75656 KB Output is correct
31 Correct 1293 ms 113060 KB Output is correct
32 Correct 69 ms 81352 KB Output is correct
33 Correct 652 ms 94032 KB Output is correct
34 Correct 1301 ms 110288 KB Output is correct
35 Correct 1079 ms 106276 KB Output is correct
36 Correct 688 ms 95424 KB Output is correct
37 Correct 501 ms 95420 KB Output is correct
38 Correct 369 ms 92492 KB Output is correct
39 Correct 336 ms 92856 KB Output is correct
40 Correct 300 ms 93192 KB Output is correct
41 Correct 845 ms 101404 KB Output is correct
42 Correct 872 ms 102596 KB Output is correct
43 Correct 70 ms 81868 KB Output is correct
44 Correct 821 ms 100284 KB Output is correct
45 Correct 720 ms 97476 KB Output is correct
46 Correct 595 ms 92108 KB Output is correct
47 Correct 347 ms 91380 KB Output is correct
48 Correct 302 ms 90528 KB Output is correct
49 Correct 426 ms 92948 KB Output is correct
50 Correct 558 ms 98992 KB Output is correct
51 Correct 420 ms 91584 KB Output is correct
52 Execution timed out 5094 ms 282752 KB Time limit exceeded
53 Halted 0 ms 0 KB -