답안 #906012

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
906012 2024-01-13T09:27:56 Z nguyentunglam 새 집 (APIO18_new_home) C++17
57 / 100
5000 ms 349672 KB
#include<bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define endl "\n"
using namespace std;

const int N = 3e5 + 10;

int n, k, q, sz;

int x[N * 3], t[N], a[N], b[N], cost[N], c[N], y[N], ans[N];

int pre[N * 3], nxt[N * 3];

vector<int> rrh, open[N * 3], close[N * 3], event[N * 3];

set<pair<int, int> > s[N];

bool alive[N * 3];

bool bug;

priority_queue<pair<int, int> > bit0[N], bit1[N];

void add0 (int pos, pair<int, int> tmp) {
  while (pos) {
    bit0[pos].push(tmp);
    pos -= pos & -pos;
  }
}

int get0(int pos, int _pos) {
  int ret = 0;
  while (pos <= sz) {
    while (!bit0[pos].empty()) {
      int i = bit0[pos].top().second;
      int j = nxt[i];
      if (alive[i] == 0 || x[i] == x[j] || abs(x[i] - _pos) > abs(x[j] - _pos)) bit0[pos].pop();
      else {
        ret = max(ret, _pos - x[i]);
//        if (abs(x[i] - _pos) == 1) cout << i << " " << j << endl;
        break;
      }
    }
    pos += pos & -pos;
  }
  return ret;
}

void add1 (int pos, pair<int, int> tmp) {
  while (pos <= sz) {
    bit1[pos].push(tmp);
    pos += pos & -pos;
  }
}

int get1(int pos, int _pos) {
  int ret = 0;
  while (pos) {
    while (!bit1[pos].empty()) {
      int i = bit1[pos].top().second;
      int j = pre[i];
      if (alive[i] == 0 || x[i] == x[j] || abs(x[i] - _pos) > abs(x[j] - _pos)) bit1[pos].pop();
      else {
        ret = max(ret, x[i] - _pos);
        break;
      }
    }
    pos -= pos & -pos;
  }
  return ret;
}

void compress () {
  sort(all(rrh));
  rrh.resize(unique(all(rrh)) - rrh.begin());
}

int id (int x) {
  return upper_bound(all(rrh), x) - rrh.begin();
}

int32_t main() {
  #define task ""

  cin.tie(0) -> sync_with_stdio(0);

  if (fopen("task.inp", "r")) {
    freopen("task.inp", "r", stdin);
    freopen("task.out", "w", stdout);
  }

  if (fopen(task".inp", "r")) {
    freopen (task".inp", "r", stdin);
    freopen (task".out", "w", stdout);
  }

  cin >> n >> k >> q;

  for(int i = 1; i <= n; i++) cin >> x[i] >> t[i] >> a[i] >> b[i];

  for(int i = 1; i <= q; i++) cin >> c[i] >> y[i];

  for(int i = 1; i <= n; i++) {
    rrh.push_back(a[i]);
    rrh.push_back(b[i]);
  }
  for(int i = 1; i <= q; i++) rrh.push_back(y[i]);

  compress();

  for(int i = 1; i <= n; i++) {
    a[i] = id(a[i]);
    b[i] = id(b[i]);
    open[a[i]].push_back(i);
    close[b[i]].push_back(i);
  }

  for(int i = 1; i <= q; i++) {
    y[i] = id(y[i]);
    event[y[i]].push_back(i);
  }

  int m = rrh.size();

  rrh.clear();
  for(int i = 1; i <= q; i++) rrh.push_back(c[i]);
  compress();

  int cnt = n;
  sz = rrh.size();

  for(int i = 1; i <= k; i++) {
    x[cnt + 1] = -1e9;
    x[cnt + 2] = 1e9;
    alive[cnt + 1] = alive[cnt + 2] = 1;
    s[i].insert({x[cnt + 1], cnt + 1});
    s[i].insert({x[cnt + 2], cnt + 2});
    add1(1, make_pair(x[cnt + 2], cnt + 2));
    nxt[cnt + 1] = cnt + 2;
    pre[cnt + 2] = cnt + 1;
    cnt += 2;
  }

  for(int cur = 1; cur <= m; cur++) {
    for(int &j : open[cur]) {
      auto iter = s[t[j]].lower_bound(make_pair(x[j], j));
      int to = iter -> second;
      --iter;
      int from = iter -> second;
      int middle;
      middle = id(x[from] + x[j] >> 1);

      add0(middle, make_pair(-x[from], from));
      add1(middle + 1, make_pair(x[j], j));

      middle = id(x[j] + x[to] >> 1);

      add0(middle, make_pair(-x[j], j));
      add1(middle + 1, make_pair(x[to], to));

      nxt[from] = j;
      pre[j] = from;
      nxt[j] = to;
      pre[to] = j;
      s[t[j]].insert({x[j], j});
      alive[j] = 1;
    }
    for(int &j : event[cur]) {
      int tmp = id(c[j]);
      int cost1 = get0(tmp, c[j]);
      int cost2 = get1(tmp, c[j]);
      ans[j] = max(cost1, cost2);
    }
    for(int &j : close[cur]) {
      auto iter = s[t[j]].find(make_pair(x[j], j));
      ++iter;
      int to = iter -> second;
      --iter; --iter;
      int from = iter -> second;

      int middle = id(x[from] + x[to] >> 1);
      add0(middle, make_pair(-x[from], from));
      add1(middle + 1, make_pair(x[to], to));

      nxt[from] = to;
      pre[to] = from;
      s[t[j]].erase(s[t[j]].find(make_pair(x[j], j)));
      alive[j] = 0;
    }
  }

  cerr << 1.0 * clock() / CLOCKS_PER_SEC << endl;

  for(int i = 1; i <= q; i++) {
    if (ans[i] > 1e8) ans[i] = -1;
    cout << ans[i] << endl;
  }

}

Compilation message

new_home.cpp: In function 'int32_t main()':
new_home.cpp:151:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  151 |       middle = id(x[from] + x[j] >> 1);
      |                   ~~~~~~~~^~~~~~
new_home.cpp:156:24: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  156 |       middle = id(x[j] + x[to] >> 1);
      |                   ~~~~~^~~~~~~
new_home.cpp:181:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  181 |       int middle = id(x[from] + x[to] >> 1);
      |                       ~~~~~~~~^~~~~~~
new_home.cpp:88:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |     freopen("task.inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:89:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |     freopen("task.out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:93:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |     freopen (task".inp", "r", stdin);
      |     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:94:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |     freopen (task".out", "w", stdout);
      |     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 111184 KB Output is correct
2 Correct 32 ms 111184 KB Output is correct
3 Correct 32 ms 111192 KB Output is correct
4 Correct 32 ms 111192 KB Output is correct
5 Correct 33 ms 111452 KB Output is correct
6 Correct 34 ms 111440 KB Output is correct
7 Correct 36 ms 111688 KB Output is correct
8 Correct 35 ms 111448 KB Output is correct
9 Correct 34 ms 111708 KB Output is correct
10 Correct 33 ms 111452 KB Output is correct
11 Correct 33 ms 111444 KB Output is correct
12 Correct 35 ms 111440 KB Output is correct
13 Correct 35 ms 111600 KB Output is correct
14 Correct 34 ms 111596 KB Output is correct
15 Correct 34 ms 111452 KB Output is correct
16 Correct 33 ms 111448 KB Output is correct
17 Correct 35 ms 111440 KB Output is correct
18 Correct 37 ms 111412 KB Output is correct
19 Correct 38 ms 111652 KB Output is correct
20 Correct 34 ms 111444 KB Output is correct
21 Correct 33 ms 111420 KB Output is correct
22 Correct 34 ms 111452 KB Output is correct
23 Correct 36 ms 111452 KB Output is correct
24 Correct 33 ms 111400 KB Output is correct
25 Correct 34 ms 111444 KB Output is correct
26 Correct 33 ms 111416 KB Output is correct
27 Correct 35 ms 111700 KB Output is correct
28 Correct 34 ms 111452 KB Output is correct
29 Correct 36 ms 111452 KB Output is correct
30 Correct 34 ms 111440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 111184 KB Output is correct
2 Correct 32 ms 111184 KB Output is correct
3 Correct 32 ms 111192 KB Output is correct
4 Correct 32 ms 111192 KB Output is correct
5 Correct 33 ms 111452 KB Output is correct
6 Correct 34 ms 111440 KB Output is correct
7 Correct 36 ms 111688 KB Output is correct
8 Correct 35 ms 111448 KB Output is correct
9 Correct 34 ms 111708 KB Output is correct
10 Correct 33 ms 111452 KB Output is correct
11 Correct 33 ms 111444 KB Output is correct
12 Correct 35 ms 111440 KB Output is correct
13 Correct 35 ms 111600 KB Output is correct
14 Correct 34 ms 111596 KB Output is correct
15 Correct 34 ms 111452 KB Output is correct
16 Correct 33 ms 111448 KB Output is correct
17 Correct 35 ms 111440 KB Output is correct
18 Correct 37 ms 111412 KB Output is correct
19 Correct 38 ms 111652 KB Output is correct
20 Correct 34 ms 111444 KB Output is correct
21 Correct 33 ms 111420 KB Output is correct
22 Correct 34 ms 111452 KB Output is correct
23 Correct 36 ms 111452 KB Output is correct
24 Correct 33 ms 111400 KB Output is correct
25 Correct 34 ms 111444 KB Output is correct
26 Correct 33 ms 111416 KB Output is correct
27 Correct 35 ms 111700 KB Output is correct
28 Correct 34 ms 111452 KB Output is correct
29 Correct 36 ms 111452 KB Output is correct
30 Correct 34 ms 111440 KB Output is correct
31 Correct 619 ms 153008 KB Output is correct
32 Correct 129 ms 124592 KB Output is correct
33 Correct 582 ms 151264 KB Output is correct
34 Correct 540 ms 151428 KB Output is correct
35 Correct 628 ms 152912 KB Output is correct
36 Correct 712 ms 153240 KB Output is correct
37 Correct 395 ms 149932 KB Output is correct
38 Correct 413 ms 150196 KB Output is correct
39 Correct 327 ms 149644 KB Output is correct
40 Correct 342 ms 149776 KB Output is correct
41 Correct 454 ms 142236 KB Output is correct
42 Correct 378 ms 143048 KB Output is correct
43 Correct 80 ms 121804 KB Output is correct
44 Correct 375 ms 141260 KB Output is correct
45 Correct 366 ms 140280 KB Output is correct
46 Correct 363 ms 133068 KB Output is correct
47 Correct 265 ms 143564 KB Output is correct
48 Correct 248 ms 142836 KB Output is correct
49 Correct 291 ms 143224 KB Output is correct
50 Correct 298 ms 143992 KB Output is correct
51 Correct 289 ms 139212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3052 ms 313516 KB Output is correct
2 Correct 4530 ms 309248 KB Output is correct
3 Correct 2466 ms 349672 KB Output is correct
4 Correct 2893 ms 306948 KB Output is correct
5 Correct 4476 ms 325812 KB Output is correct
6 Correct 4615 ms 324700 KB Output is correct
7 Correct 2180 ms 342084 KB Output is correct
8 Correct 2447 ms 312544 KB Output is correct
9 Correct 2851 ms 317128 KB Output is correct
10 Correct 3748 ms 322628 KB Output is correct
11 Correct 1403 ms 316408 KB Output is correct
12 Correct 1455 ms 318596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5053 ms 314588 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 111184 KB Output is correct
2 Correct 32 ms 111184 KB Output is correct
3 Correct 32 ms 111192 KB Output is correct
4 Correct 32 ms 111192 KB Output is correct
5 Correct 33 ms 111452 KB Output is correct
6 Correct 34 ms 111440 KB Output is correct
7 Correct 36 ms 111688 KB Output is correct
8 Correct 35 ms 111448 KB Output is correct
9 Correct 34 ms 111708 KB Output is correct
10 Correct 33 ms 111452 KB Output is correct
11 Correct 33 ms 111444 KB Output is correct
12 Correct 35 ms 111440 KB Output is correct
13 Correct 35 ms 111600 KB Output is correct
14 Correct 34 ms 111596 KB Output is correct
15 Correct 34 ms 111452 KB Output is correct
16 Correct 33 ms 111448 KB Output is correct
17 Correct 35 ms 111440 KB Output is correct
18 Correct 37 ms 111412 KB Output is correct
19 Correct 38 ms 111652 KB Output is correct
20 Correct 34 ms 111444 KB Output is correct
21 Correct 33 ms 111420 KB Output is correct
22 Correct 34 ms 111452 KB Output is correct
23 Correct 36 ms 111452 KB Output is correct
24 Correct 33 ms 111400 KB Output is correct
25 Correct 34 ms 111444 KB Output is correct
26 Correct 33 ms 111416 KB Output is correct
27 Correct 35 ms 111700 KB Output is correct
28 Correct 34 ms 111452 KB Output is correct
29 Correct 36 ms 111452 KB Output is correct
30 Correct 34 ms 111440 KB Output is correct
31 Correct 619 ms 153008 KB Output is correct
32 Correct 129 ms 124592 KB Output is correct
33 Correct 582 ms 151264 KB Output is correct
34 Correct 540 ms 151428 KB Output is correct
35 Correct 628 ms 152912 KB Output is correct
36 Correct 712 ms 153240 KB Output is correct
37 Correct 395 ms 149932 KB Output is correct
38 Correct 413 ms 150196 KB Output is correct
39 Correct 327 ms 149644 KB Output is correct
40 Correct 342 ms 149776 KB Output is correct
41 Correct 454 ms 142236 KB Output is correct
42 Correct 378 ms 143048 KB Output is correct
43 Correct 80 ms 121804 KB Output is correct
44 Correct 375 ms 141260 KB Output is correct
45 Correct 366 ms 140280 KB Output is correct
46 Correct 363 ms 133068 KB Output is correct
47 Correct 265 ms 143564 KB Output is correct
48 Correct 248 ms 142836 KB Output is correct
49 Correct 291 ms 143224 KB Output is correct
50 Correct 298 ms 143992 KB Output is correct
51 Correct 289 ms 139212 KB Output is correct
52 Correct 460 ms 162212 KB Output is correct
53 Correct 396 ms 161840 KB Output is correct
54 Correct 501 ms 155856 KB Output is correct
55 Correct 458 ms 149288 KB Output is correct
56 Correct 417 ms 149712 KB Output is correct
57 Correct 403 ms 142644 KB Output is correct
58 Correct 417 ms 148932 KB Output is correct
59 Correct 470 ms 152008 KB Output is correct
60 Correct 453 ms 143540 KB Output is correct
61 Correct 105 ms 129556 KB Output is correct
62 Correct 458 ms 153344 KB Output is correct
63 Correct 480 ms 154056 KB Output is correct
64 Correct 538 ms 152784 KB Output is correct
65 Correct 436 ms 146640 KB Output is correct
66 Correct 420 ms 143764 KB Output is correct
67 Correct 124 ms 127692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 111184 KB Output is correct
2 Correct 32 ms 111184 KB Output is correct
3 Correct 32 ms 111192 KB Output is correct
4 Correct 32 ms 111192 KB Output is correct
5 Correct 33 ms 111452 KB Output is correct
6 Correct 34 ms 111440 KB Output is correct
7 Correct 36 ms 111688 KB Output is correct
8 Correct 35 ms 111448 KB Output is correct
9 Correct 34 ms 111708 KB Output is correct
10 Correct 33 ms 111452 KB Output is correct
11 Correct 33 ms 111444 KB Output is correct
12 Correct 35 ms 111440 KB Output is correct
13 Correct 35 ms 111600 KB Output is correct
14 Correct 34 ms 111596 KB Output is correct
15 Correct 34 ms 111452 KB Output is correct
16 Correct 33 ms 111448 KB Output is correct
17 Correct 35 ms 111440 KB Output is correct
18 Correct 37 ms 111412 KB Output is correct
19 Correct 38 ms 111652 KB Output is correct
20 Correct 34 ms 111444 KB Output is correct
21 Correct 33 ms 111420 KB Output is correct
22 Correct 34 ms 111452 KB Output is correct
23 Correct 36 ms 111452 KB Output is correct
24 Correct 33 ms 111400 KB Output is correct
25 Correct 34 ms 111444 KB Output is correct
26 Correct 33 ms 111416 KB Output is correct
27 Correct 35 ms 111700 KB Output is correct
28 Correct 34 ms 111452 KB Output is correct
29 Correct 36 ms 111452 KB Output is correct
30 Correct 34 ms 111440 KB Output is correct
31 Correct 619 ms 153008 KB Output is correct
32 Correct 129 ms 124592 KB Output is correct
33 Correct 582 ms 151264 KB Output is correct
34 Correct 540 ms 151428 KB Output is correct
35 Correct 628 ms 152912 KB Output is correct
36 Correct 712 ms 153240 KB Output is correct
37 Correct 395 ms 149932 KB Output is correct
38 Correct 413 ms 150196 KB Output is correct
39 Correct 327 ms 149644 KB Output is correct
40 Correct 342 ms 149776 KB Output is correct
41 Correct 454 ms 142236 KB Output is correct
42 Correct 378 ms 143048 KB Output is correct
43 Correct 80 ms 121804 KB Output is correct
44 Correct 375 ms 141260 KB Output is correct
45 Correct 366 ms 140280 KB Output is correct
46 Correct 363 ms 133068 KB Output is correct
47 Correct 265 ms 143564 KB Output is correct
48 Correct 248 ms 142836 KB Output is correct
49 Correct 291 ms 143224 KB Output is correct
50 Correct 298 ms 143992 KB Output is correct
51 Correct 289 ms 139212 KB Output is correct
52 Correct 3052 ms 313516 KB Output is correct
53 Correct 4530 ms 309248 KB Output is correct
54 Correct 2466 ms 349672 KB Output is correct
55 Correct 2893 ms 306948 KB Output is correct
56 Correct 4476 ms 325812 KB Output is correct
57 Correct 4615 ms 324700 KB Output is correct
58 Correct 2180 ms 342084 KB Output is correct
59 Correct 2447 ms 312544 KB Output is correct
60 Correct 2851 ms 317128 KB Output is correct
61 Correct 3748 ms 322628 KB Output is correct
62 Correct 1403 ms 316408 KB Output is correct
63 Correct 1455 ms 318596 KB Output is correct
64 Execution timed out 5053 ms 314588 KB Time limit exceeded
65 Halted 0 ms 0 KB -