제출 #598982

#제출 시각아이디문제언어결과실행 시간메모리
598982PlurmHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++11
100 / 100
2657 ms66496 KiB
#include <bits/stdc++.h>
using namespace std;

int w[1000005];
int ans[1000005];

int rt[4000005];
int lb[4000005];
int rb[4000005];

void build(int c, int l, int r) {
  lb[c] = l;
  rb[c] = r;
  rt[c] = 1e9;
  int k = (l + r) / 2;
  if (l != r) {
    build(2 * c, l, k);
    build(2 * c + 1, k + 1, r);
  }
}

void update(int c, int l, int r, int x) {
  if (lb[c] == l && rb[c] == r) {
    rt[c] = min(rt[c], x);
    return;
  }
  int k = (lb[c] + rb[c]) / 2;
  if (l <= k && k < r) {
    update(2 * c, l, k, x);
    update(2 * c + 1, k + 1, r, x);
  } else if (r <= k) {
    update(2 * c, l, r, x);
  } else {
    update(2 * c + 1, l, r, x);
  }
}

int query(int c, int i, int mx = 1e9) {
  mx = min(mx, rt[c]);
  if (lb[c] == rb[c])
    return mx;
  int k = (lb[c] + rb[c]) / 2;
  if (i <= k)
    return query(2 * c, i, mx);
  else
    return query(2 * c + 1, i, mx);
}

void maintain(int i, int j) {
  // add (i, j) to some range data structure...
  update(1, 1, i, j);
}

bool check(int i, int j) {
  // check whether there exists a pair (i', j') such that i <= i' < j' <= j in
  // the data structure
  return query(1, i) <= j;
}

int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  stack<int> stk;
  vector<pair<int, int>> interesting;
  for (int i = 1; i <= n; i++) {
    scanf("%d", w + i);
    while (!stk.empty() && w[stk.top()] <= w[i])
      stk.pop();
    if (!stk.empty())
      interesting.push_back({stk.top(), i});
    stk.push(i);
  }
  while (!stk.empty())
    stk.pop();
  for (int i = n; i > 0; i--) {
    while (!stk.empty() && w[stk.top()] >= w[i])
      stk.pop();
    if (!stk.empty())
      interesting.push_back({i, stk.top()});
    stk.push(i);
  }
  sort(interesting.begin(), interesting.end(),
       [](pair<int, int> x, pair<int, int> y) {
         return w[x.first] + w[x.second] > w[y.first] + w[y.second];
       });
  vector<tuple<int, int, int, int>> queries;
  for (int i = 0; i < m; i++) {
    int l, r, k;
    scanf("%d%d%d", &l, &r, &k);
    queries.emplace_back(l, r, k, i);
  }
  sort(queries.begin(), queries.end(),
       [](tuple<int, int, int, int> x, tuple<int, int, int, int> y) {
         return get<2>(x) > get<2>(y);
       });
  build(1, 1, n);
  int lptr = 0;
  for (auto q : queries) {
    int l, r, k, i;
    tie(l, r, k, i) = q;
    while (lptr < interesting.size() &&
           w[interesting[lptr].first] + w[interesting[lptr].second] > k) {
      maintain(interesting[lptr].first, interesting[lptr].second);
      lptr++;
    }
    ans[i] = check(l, r) ? 0 : 1;
  }
  for (int i = 0; i < m; i++) {
    printf("%d\n", ans[i]);
  }
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sortbooks.cpp: In function 'int main()':
sortbooks.cpp:101:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |     while (lptr < interesting.size() &&
      |            ~~~~~^~~~~~~~~~~~~~~~~~~~
sortbooks.cpp:62:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |   scanf("%d%d", &n, &m);
      |   ~~~~~^~~~~~~~~~~~~~~~
sortbooks.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |     scanf("%d", w + i);
      |     ~~~~~^~~~~~~~~~~~~
sortbooks.cpp:89:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |     scanf("%d%d%d", &l, &r, &k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...