답안 #625185

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
625185 2022-08-09T14:42:31 Z EthanKim8683 Circus (Balkan15_CIRCUS) C++17
11 / 100
78 ms 17044 KB
#ifndef ETHANKIM8683
#include "circus.h"
#endif
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

using I = int;

/*
Something to note is that jumps may only get
smaller and smaller the closer the performer
gets to the entrance, the inverse is also true.

let a = this rope's distance to the entrance
let b = that rope's distance to the ceiling
let c = that rope's distance to the entrance

Going forward:
`c - a >= b`, therefore `a <= c - b`

Going backward:
`a - c >= b`, therefore `a >= c + b`

The closest rope that satisfies this property
solves the current rope.

Now, keep in mind, a bend (the only time going
backwards is valid) happens, at max, one time.
*/

const I N = 100000;
const I LOGN = 17;
const I MIN = -1e9;
const I MAX = 1e9;

priority_queue<pair<I, I>> que1;
priority_queue<pair<I, I>, vector<pair<I, I>>, greater<pair<I, I>>> que2;
I diss[N];
vector<I> cpss1;
vector<I> cpss2;
I spas1[N + 1][LOGN + 1];
I spas2[N + 1][LOGN + 1];

I cps1(I x) {
  return lower_bound(cpss1.begin(), cpss1.end(), x) - cpss1.begin();
}

I cps2(I x) {
  return upper_bound(cpss2.begin(), cpss2.end(), x) - cpss2.begin() - 1;
}

void asn1(I i, I val) {
  spas1[i][0] = min(spas1[i][0], val);
}

void asn2(I i, I val) {
  spas2[i][0] = max(spas2[i][0], val);
}

void unq1() {
  sort(cpss1.begin(), cpss1.end());
  cpss1.erase(unique(cpss1.begin(), cpss1.end()), cpss1.end());
}

void unq2() {
  sort(cpss2.begin(), cpss2.end());
  cpss2.erase(unique(cpss2.begin(), cpss2.end()), cpss2.end());
}

void bld1() {
  for (I i = 1; i <= LOGN; i++)
    for (I j = 0; j + (1 << (i - 1)) < cpss1.size(); j++)
      spas1[j][i] = min(spas1[j][i - 1], spas1[j + (1 << (i - 1))][i - 1]);
}

void bld2() {
  for (I i = 1; i <= LOGN; i++)
    for (I j = 0; j + (1 << (i - 1)) < cpss2.size(); j++)
      spas2[j][i] = max(spas2[j][i - 1], spas2[j + (1 << (i - 1))][i - 1]);
}

I qry1(I l, I r) {
  const I dis = 31 - __builtin_clz(r - l);
  return min(spas1[l][dis], spas1[r - (1 << dis)][dis]);
}

I qry2(I l, I r) {
  const I dis = 31 - __builtin_clz(r - l);
  return max(spas2[l][dis], spas2[r - (1 << dis)][dis]);
}

void init(I n, I m, I p_arr[]) {
  fill(&spas1[0][0], &spas1[0][0] + sizeof(spas1) / sizeof(I), MAX);
  fill(&spas2[0][0], &spas2[0][0] + sizeof(spas2) / sizeof(I), MIN);
  fill_n(diss, n, MAX);
  sort(p_arr, p_arr + n);
  que1.push({m - 0, m});
  I clo = MAX;
  for (I i = n - 1; i >= 0; i--) {
    const auto p = p_arr[i];
    while (!que1.empty() && p <= que1.top().first) {
      const auto [d, a] = que1.top();
      que1.pop();
      clo = min(clo, a);
    }
    que1.push({p - (diss[i] = min(diss[i], clo - p)), p});
  }
  clo = MIN;
  for (I i = 0; i < n; i++) {
    const auto p = p_arr[i];
    while (!que2.empty() && p >= que2.top().first) {
      const auto [d, a] = que2.top();
      que2.pop();
      clo = max(clo, a);
    }
    que2.push({p + (diss[i] = min(diss[i], p - clo)), p});
  }
  for (I i = 0; i < n; i++) {
    cpss1.push_back(p_arr[i] - diss[i]);
    cpss2.push_back(p_arr[i] + diss[i]);
  }
  cpss1.push_back(m - 0);
  cpss2.push_back(m + 0);
  unq1();
  unq2();
  for (I i = 0; i < n; i++) {
    asn1(cps1(p_arr[i] - diss[i]), p_arr[i]);
    asn2(cps2(p_arr[i] + diss[i]), p_arr[i]);
  }
  asn1(cps1(m - 0), m);
  asn2(cps2(m + 0), m);
  bld1();
  bld2();
}

I minLength(I d) {
  I res = qry1(cps1(d), cpss1.size()) - d;
  const I ind = cps2(d);
  if (ind >= 0)
    res = min(res, d - qry2(0, ind + 1));
  return res;
}

#ifdef ETHANKIM8683
#include <iostream>
#include <cstdio>

I main(void) {
  cin.tie(0)->sync_with_stdio(0);
  I n, m;
  cin >> n >> m;
  static I p[N];
  for (I i = 0; i < n; i++)
    cin >> p[i];
  init(n, m, p);
  while (true) {
    I d = -1;
    cin >> d;
    if (d == -1)
      break;
    printf("%i\n", minLength(d));
  }
  return 0;
}
#endif

Compilation message

circus.cpp: In function 'void bld1()':
circus.cpp:75:38: warning: comparison of integer expressions of different signedness: 'I' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |     for (I j = 0; j + (1 << (i - 1)) < cpss1.size(); j++)
      |                   ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
circus.cpp: In function 'void bld2()':
circus.cpp:81:38: warning: comparison of integer expressions of different signedness: 'I' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |     for (I j = 0; j + (1 << (i - 1)) < cpss2.size(); j++)
      |                   ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
grader.cpp: In function 'int main()':
grader.cpp:14:12: warning: unused variable 'max_code' [-Wunused-variable]
   14 |  long long max_code;
      |            ^~~~~~~~
grader.cpp:16:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |  scanf("%d%d", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~
grader.cpp:18:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |   scanf("%d", &P[i]);
      |   ~~~~~^~~~~~~~~~~~~
grader.cpp:21:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |  scanf("%d", &Q);
      |  ~~~~~^~~~~~~~~~
grader.cpp:23:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |   scanf("%d", &d);
      |   ~~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 65 ms 16808 KB Output is correct
2 Correct 78 ms 17044 KB Output is correct
3 Correct 67 ms 16888 KB Output is correct
4 Correct 66 ms 16824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 14380 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 14380 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 14380 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 65 ms 16808 KB Output is correct
2 Correct 78 ms 17044 KB Output is correct
3 Correct 67 ms 16888 KB Output is correct
4 Correct 66 ms 16824 KB Output is correct
5 Incorrect 10 ms 14380 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 65 ms 16808 KB Output is correct
2 Correct 78 ms 17044 KB Output is correct
3 Correct 67 ms 16888 KB Output is correct
4 Correct 66 ms 16824 KB Output is correct
5 Incorrect 10 ms 14380 KB Output isn't correct
6 Halted 0 ms 0 KB -