답안 #906035

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
906035 2024-01-13T10:56:21 Z nguyentunglam 새 집 (APIO18_new_home) C++17
57 / 100
5000 ms 373864 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, int border, pair<int, int> tmp) {
  while (pos >= border) {
    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]);
        break;
      }
    }
    pos += pos & -pos;
  }
  return ret;
}

void add1 (int pos, int border, pair<int, int> tmp) {
  while (pos <= border) {
    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();
}

struct BIT {
  vector<pair<int, int> > rrh;
  vector<int> bit;
  int m, lg;
  void compress () {
    sort(all(rrh));
    rrh.resize(unique(all(rrh)) - rrh.begin());
    m = rrh.size();
    lg = log2(m);
    bit.resize(m + 1);
  }

  void up(int pos, int val) {
    while (pos <= m) {
      bit[pos] += val;
      pos += pos & -pos;
    }
  }

  int get (int pos) {
    int ret = 0;
    while (pos) {
      ret += bit[pos];
      pos -= pos & -pos;
    }
    return ret;
  }

  int reach (int sum) {
    int cur = 0, pos = 0;
    for(int j = lg; j >= 0; j--) {
      int x = pos + (1 << j);
      if (x <= m && cur + bit[x] <= sum) cur += bit[pos = x];
    }
    return pos;
  }

  pair<int, int> add (pair<int, int> tmp) {
    int pos = upper_bound(all(rrh), tmp) - rrh.begin();
    up(pos, 1);
    int sum = get(pos);
    int l = reach(sum - 2) + 1;
    int r = reach(sum) + 1;
    l = rrh[l - 1].second;
    r = rrh[r - 1].second;
    return make_pair(l, r);
  }

  pair<int, int> del (pair<int, int> tmp) {
    int pos = upper_bound(all(rrh), tmp) - rrh.begin();
    int sum = get(pos);
    int l = reach(sum - 2) + 1;
    int r = reach(sum) + 1;
    l = rrh[l - 1].second;
    r = rrh[r - 1].second;
    up(pos, -1);
    return make_pair(l, r);
  }
} bit[N];

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 <= n; i++) bit[t[i]].rrh.emplace_back(x[i], i);

  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, sz, make_pair(x[cnt + 2], cnt + 2));
    nxt[cnt + 1] = cnt + 2;
    pre[cnt + 2] = cnt + 1;

    bit[i].rrh.emplace_back(x[cnt + 1], cnt + 1);
    bit[i].rrh.emplace_back(x[cnt + 2], cnt + 2);

    bit[i].compress();

    bit[i].add(make_pair(x[cnt + 1], cnt + 1));
    bit[i].add(make_pair(x[cnt + 2], cnt + 2));
    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;
      tie(from, to) = bit[t[j]].add(make_pair(x[j], j));
//      cout << from << " " << to << "add\n";
      int middle;
      middle = id(x[from] + x[j] >> 1);
      int L = id(x[from] - 1) + 1, R = id(x[to]), pos = id(x[j]);

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

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

      add0(middle, pos, make_pair(-x[j], j));
      add1(middle + 1, R, 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;
      tie(from, to) = bit[t[j]].del(make_pair(x[j], j));

//      cout << bit[1].get(1) << " " << from << " " << to << "del\n";

      int L = id(x[from] - 1) + 1, R = id(x[to]), middle = id(x[from] + x[to] >> 1);
      add0(middle, L, make_pair(-x[from], from));
      add1(middle + 1, R, 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:222:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  222 |       middle = id(x[from] + x[j] >> 1);
      |                   ~~~~~~~~^~~~~~
new_home.cpp:228:24: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  228 |       middle = id(x[j] + x[to] >> 1);
      |                   ~~~~~^~~~~~~
new_home.cpp:257:71: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  257 |       int L = id(x[from] - 1) + 1, R = id(x[to]), middle = id(x[from] + x[to] >> 1);
      |                                                               ~~~~~~~~^~~~~~~
new_home.cpp:147:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  147 |     freopen("task.inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:148:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |     freopen("task.out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:152:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  152 |     freopen (task".inp", "r", stdin);
      |     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:153:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  153 |     freopen (task".out", "w", stdout);
      |     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 125784 KB Output is correct
2 Correct 38 ms 125784 KB Output is correct
3 Correct 40 ms 125788 KB Output is correct
4 Correct 38 ms 125708 KB Output is correct
5 Correct 37 ms 125704 KB Output is correct
6 Correct 41 ms 125944 KB Output is correct
7 Correct 40 ms 126036 KB Output is correct
8 Correct 40 ms 125780 KB Output is correct
9 Correct 42 ms 126032 KB Output is correct
10 Correct 38 ms 125776 KB Output is correct
11 Correct 38 ms 125712 KB Output is correct
12 Correct 39 ms 125788 KB Output is correct
13 Correct 38 ms 125936 KB Output is correct
14 Correct 39 ms 125648 KB Output is correct
15 Correct 40 ms 125776 KB Output is correct
16 Correct 38 ms 125784 KB Output is correct
17 Correct 38 ms 125964 KB Output is correct
18 Correct 40 ms 125744 KB Output is correct
19 Correct 38 ms 125784 KB Output is correct
20 Correct 40 ms 125780 KB Output is correct
21 Correct 38 ms 125780 KB Output is correct
22 Correct 38 ms 125780 KB Output is correct
23 Correct 38 ms 125992 KB Output is correct
24 Correct 40 ms 125788 KB Output is correct
25 Correct 38 ms 125712 KB Output is correct
26 Correct 39 ms 125800 KB Output is correct
27 Correct 38 ms 125700 KB Output is correct
28 Correct 38 ms 125788 KB Output is correct
29 Correct 40 ms 125700 KB Output is correct
30 Correct 40 ms 125764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 125784 KB Output is correct
2 Correct 38 ms 125784 KB Output is correct
3 Correct 40 ms 125788 KB Output is correct
4 Correct 38 ms 125708 KB Output is correct
5 Correct 37 ms 125704 KB Output is correct
6 Correct 41 ms 125944 KB Output is correct
7 Correct 40 ms 126036 KB Output is correct
8 Correct 40 ms 125780 KB Output is correct
9 Correct 42 ms 126032 KB Output is correct
10 Correct 38 ms 125776 KB Output is correct
11 Correct 38 ms 125712 KB Output is correct
12 Correct 39 ms 125788 KB Output is correct
13 Correct 38 ms 125936 KB Output is correct
14 Correct 39 ms 125648 KB Output is correct
15 Correct 40 ms 125776 KB Output is correct
16 Correct 38 ms 125784 KB Output is correct
17 Correct 38 ms 125964 KB Output is correct
18 Correct 40 ms 125744 KB Output is correct
19 Correct 38 ms 125784 KB Output is correct
20 Correct 40 ms 125780 KB Output is correct
21 Correct 38 ms 125780 KB Output is correct
22 Correct 38 ms 125780 KB Output is correct
23 Correct 38 ms 125992 KB Output is correct
24 Correct 40 ms 125788 KB Output is correct
25 Correct 38 ms 125712 KB Output is correct
26 Correct 39 ms 125800 KB Output is correct
27 Correct 38 ms 125700 KB Output is correct
28 Correct 38 ms 125788 KB Output is correct
29 Correct 40 ms 125700 KB Output is correct
30 Correct 40 ms 125764 KB Output is correct
31 Correct 576 ms 155304 KB Output is correct
32 Correct 135 ms 131276 KB Output is correct
33 Correct 534 ms 144608 KB Output is correct
34 Correct 655 ms 155104 KB Output is correct
35 Correct 598 ms 151744 KB Output is correct
36 Correct 581 ms 145612 KB Output is correct
37 Correct 358 ms 145728 KB Output is correct
38 Correct 319 ms 141064 KB Output is correct
39 Correct 280 ms 142336 KB Output is correct
40 Correct 301 ms 141004 KB Output is correct
41 Correct 452 ms 150636 KB Output is correct
42 Correct 433 ms 150988 KB Output is correct
43 Correct 88 ms 131528 KB Output is correct
44 Correct 432 ms 150672 KB Output is correct
45 Correct 437 ms 147912 KB Output is correct
46 Correct 422 ms 141768 KB Output is correct
47 Correct 263 ms 147144 KB Output is correct
48 Correct 244 ms 145752 KB Output is correct
49 Correct 293 ms 147852 KB Output is correct
50 Correct 308 ms 150456 KB Output is correct
51 Correct 323 ms 146080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3510 ms 317384 KB Output is correct
2 Correct 3479 ms 210332 KB Output is correct
3 Correct 2933 ms 366560 KB Output is correct
4 Correct 3529 ms 326084 KB Output is correct
5 Correct 2852 ms 182616 KB Output is correct
6 Correct 3563 ms 201364 KB Output is correct
7 Correct 2373 ms 373864 KB Output is correct
8 Correct 2670 ms 323380 KB Output is correct
9 Correct 3066 ms 304196 KB Output is correct
10 Correct 3646 ms 257856 KB Output is correct
11 Correct 1232 ms 216900 KB Output is correct
12 Correct 1482 ms 249540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5032 ms 297600 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 125784 KB Output is correct
2 Correct 38 ms 125784 KB Output is correct
3 Correct 40 ms 125788 KB Output is correct
4 Correct 38 ms 125708 KB Output is correct
5 Correct 37 ms 125704 KB Output is correct
6 Correct 41 ms 125944 KB Output is correct
7 Correct 40 ms 126036 KB Output is correct
8 Correct 40 ms 125780 KB Output is correct
9 Correct 42 ms 126032 KB Output is correct
10 Correct 38 ms 125776 KB Output is correct
11 Correct 38 ms 125712 KB Output is correct
12 Correct 39 ms 125788 KB Output is correct
13 Correct 38 ms 125936 KB Output is correct
14 Correct 39 ms 125648 KB Output is correct
15 Correct 40 ms 125776 KB Output is correct
16 Correct 38 ms 125784 KB Output is correct
17 Correct 38 ms 125964 KB Output is correct
18 Correct 40 ms 125744 KB Output is correct
19 Correct 38 ms 125784 KB Output is correct
20 Correct 40 ms 125780 KB Output is correct
21 Correct 38 ms 125780 KB Output is correct
22 Correct 38 ms 125780 KB Output is correct
23 Correct 38 ms 125992 KB Output is correct
24 Correct 40 ms 125788 KB Output is correct
25 Correct 38 ms 125712 KB Output is correct
26 Correct 39 ms 125800 KB Output is correct
27 Correct 38 ms 125700 KB Output is correct
28 Correct 38 ms 125788 KB Output is correct
29 Correct 40 ms 125700 KB Output is correct
30 Correct 40 ms 125764 KB Output is correct
31 Correct 576 ms 155304 KB Output is correct
32 Correct 135 ms 131276 KB Output is correct
33 Correct 534 ms 144608 KB Output is correct
34 Correct 655 ms 155104 KB Output is correct
35 Correct 598 ms 151744 KB Output is correct
36 Correct 581 ms 145612 KB Output is correct
37 Correct 358 ms 145728 KB Output is correct
38 Correct 319 ms 141064 KB Output is correct
39 Correct 280 ms 142336 KB Output is correct
40 Correct 301 ms 141004 KB Output is correct
41 Correct 452 ms 150636 KB Output is correct
42 Correct 433 ms 150988 KB Output is correct
43 Correct 88 ms 131528 KB Output is correct
44 Correct 432 ms 150672 KB Output is correct
45 Correct 437 ms 147912 KB Output is correct
46 Correct 422 ms 141768 KB Output is correct
47 Correct 263 ms 147144 KB Output is correct
48 Correct 244 ms 145752 KB Output is correct
49 Correct 293 ms 147852 KB Output is correct
50 Correct 308 ms 150456 KB Output is correct
51 Correct 323 ms 146080 KB Output is correct
52 Correct 547 ms 175780 KB Output is correct
53 Correct 533 ms 174780 KB Output is correct
54 Correct 617 ms 165360 KB Output is correct
55 Correct 449 ms 159236 KB Output is correct
56 Correct 490 ms 160876 KB Output is correct
57 Correct 449 ms 151492 KB Output is correct
58 Correct 579 ms 158928 KB Output is correct
59 Correct 478 ms 161300 KB Output is correct
60 Correct 447 ms 152792 KB Output is correct
61 Correct 108 ms 143816 KB Output is correct
62 Correct 536 ms 167748 KB Output is correct
63 Correct 608 ms 165520 KB Output is correct
64 Correct 577 ms 162728 KB Output is correct
65 Correct 547 ms 155324 KB Output is correct
66 Correct 468 ms 152500 KB Output is correct
67 Correct 157 ms 137676 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 125784 KB Output is correct
2 Correct 38 ms 125784 KB Output is correct
3 Correct 40 ms 125788 KB Output is correct
4 Correct 38 ms 125708 KB Output is correct
5 Correct 37 ms 125704 KB Output is correct
6 Correct 41 ms 125944 KB Output is correct
7 Correct 40 ms 126036 KB Output is correct
8 Correct 40 ms 125780 KB Output is correct
9 Correct 42 ms 126032 KB Output is correct
10 Correct 38 ms 125776 KB Output is correct
11 Correct 38 ms 125712 KB Output is correct
12 Correct 39 ms 125788 KB Output is correct
13 Correct 38 ms 125936 KB Output is correct
14 Correct 39 ms 125648 KB Output is correct
15 Correct 40 ms 125776 KB Output is correct
16 Correct 38 ms 125784 KB Output is correct
17 Correct 38 ms 125964 KB Output is correct
18 Correct 40 ms 125744 KB Output is correct
19 Correct 38 ms 125784 KB Output is correct
20 Correct 40 ms 125780 KB Output is correct
21 Correct 38 ms 125780 KB Output is correct
22 Correct 38 ms 125780 KB Output is correct
23 Correct 38 ms 125992 KB Output is correct
24 Correct 40 ms 125788 KB Output is correct
25 Correct 38 ms 125712 KB Output is correct
26 Correct 39 ms 125800 KB Output is correct
27 Correct 38 ms 125700 KB Output is correct
28 Correct 38 ms 125788 KB Output is correct
29 Correct 40 ms 125700 KB Output is correct
30 Correct 40 ms 125764 KB Output is correct
31 Correct 576 ms 155304 KB Output is correct
32 Correct 135 ms 131276 KB Output is correct
33 Correct 534 ms 144608 KB Output is correct
34 Correct 655 ms 155104 KB Output is correct
35 Correct 598 ms 151744 KB Output is correct
36 Correct 581 ms 145612 KB Output is correct
37 Correct 358 ms 145728 KB Output is correct
38 Correct 319 ms 141064 KB Output is correct
39 Correct 280 ms 142336 KB Output is correct
40 Correct 301 ms 141004 KB Output is correct
41 Correct 452 ms 150636 KB Output is correct
42 Correct 433 ms 150988 KB Output is correct
43 Correct 88 ms 131528 KB Output is correct
44 Correct 432 ms 150672 KB Output is correct
45 Correct 437 ms 147912 KB Output is correct
46 Correct 422 ms 141768 KB Output is correct
47 Correct 263 ms 147144 KB Output is correct
48 Correct 244 ms 145752 KB Output is correct
49 Correct 293 ms 147852 KB Output is correct
50 Correct 308 ms 150456 KB Output is correct
51 Correct 323 ms 146080 KB Output is correct
52 Correct 3510 ms 317384 KB Output is correct
53 Correct 3479 ms 210332 KB Output is correct
54 Correct 2933 ms 366560 KB Output is correct
55 Correct 3529 ms 326084 KB Output is correct
56 Correct 2852 ms 182616 KB Output is correct
57 Correct 3563 ms 201364 KB Output is correct
58 Correct 2373 ms 373864 KB Output is correct
59 Correct 2670 ms 323380 KB Output is correct
60 Correct 3066 ms 304196 KB Output is correct
61 Correct 3646 ms 257856 KB Output is correct
62 Correct 1232 ms 216900 KB Output is correct
63 Correct 1482 ms 249540 KB Output is correct
64 Execution timed out 5032 ms 297600 KB Time limit exceeded
65 Halted 0 ms 0 KB -