답안 #24312

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
24312 2017-06-04T15:10:58 Z jiaqiyang Sparklers (JOI17_sparklers) C++14
0 / 100
0 ms 1564 KB
#include <cstdio>
#include <vector>
#include <algorithm>

typedef long long i64;

const int N = 100000 + 10;
const i64 INF = 1LL << 60;

int n, k, t, x[N];

auto calc(const std::vector<i64> &cur) {
  const int tot = cur.size();
  std::vector<std::pair<i64, i64>> res;
  for (int i = 0; i < tot;) {
    i64 sum = 0, min = 0;
    int j = i;
    while (j < tot) {
      min = std::min(min, sum += cur[j++]);
      if (sum >= 0) break;
    }
    i = j;
    res.emplace_back(min, sum);
  }
  return res;
}

bool solve(int s) {
  std::vector<i64> a, b;
  for (int i = k; i > 1; --i) a.push_back(2LL * t * s - (x[i] - x[i - 1]));
  for (int i = k; i < n; ++i) b.push_back(2LL * t * s - (x[i + 1] - x[i]));
  auto u = calc(a), v = calc(b);
  auto p = u.back(), q = v.back();
  if (p.second < 0) u.pop_back(); else p = {0, 0};
  if (q.second < 0) v.pop_back(); else q = {0, 0};
  std::reverse(u.begin(), u.end());
  std::reverse(v.begin(), v.end());
  i64 cur = 0;
  while (!(u.empty() && v.empty())) {
    if (!u.empty() && cur + u.back().first >= 0) {
      cur += u.back().second;
      u.pop_back();
    } else if (cur + v.back().first >= 0) {
      cur += v.back().second;
      v.pop_back();
    } else {
      return false;
    }
  }
  return (cur + p.first >= 0 && cur + p.second + q.first >= 0) || (cur + q.first >= 0 && cur + q.second + p.first >= 0);
}

int main() {
  scanf("%d%d%d", &n, &k, &t);
  for (int i = 1; i <= n; ++i) scanf("%d", &x[i]);
  int l = 0, r = x[n];
  while (l < r) {
    int mid = (l + r) >> 1;
    if (solve(mid)) r = mid; else l = mid + 1;
  }
  printf("%d\n", l);
  return 0;
}

Compilation message

sparklers.cpp: In function 'int main()':
sparklers.cpp:54:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &n, &k, &t);
                              ^
sparklers.cpp:55:50: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   for (int i = 1; i <= n; ++i) scanf("%d", &x[i]);
                                                  ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1564 KB Output is correct
2 Correct 0 ms 1564 KB Output is correct
3 Correct 0 ms 1564 KB Output is correct
4 Correct 0 ms 1564 KB Output is correct
5 Correct 0 ms 1564 KB Output is correct
6 Correct 0 ms 1564 KB Output is correct
7 Correct 0 ms 1564 KB Output is correct
8 Correct 0 ms 1564 KB Output is correct
9 Correct 0 ms 1564 KB Output is correct
10 Correct 0 ms 1564 KB Output is correct
11 Correct 0 ms 1564 KB Output is correct
12 Incorrect 0 ms 1564 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1564 KB Output is correct
2 Correct 0 ms 1564 KB Output is correct
3 Correct 0 ms 1564 KB Output is correct
4 Correct 0 ms 1564 KB Output is correct
5 Correct 0 ms 1564 KB Output is correct
6 Correct 0 ms 1564 KB Output is correct
7 Correct 0 ms 1564 KB Output is correct
8 Correct 0 ms 1564 KB Output is correct
9 Correct 0 ms 1564 KB Output is correct
10 Correct 0 ms 1564 KB Output is correct
11 Correct 0 ms 1564 KB Output is correct
12 Incorrect 0 ms 1564 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1564 KB Output is correct
2 Correct 0 ms 1564 KB Output is correct
3 Correct 0 ms 1564 KB Output is correct
4 Correct 0 ms 1564 KB Output is correct
5 Correct 0 ms 1564 KB Output is correct
6 Correct 0 ms 1564 KB Output is correct
7 Correct 0 ms 1564 KB Output is correct
8 Correct 0 ms 1564 KB Output is correct
9 Correct 0 ms 1564 KB Output is correct
10 Correct 0 ms 1564 KB Output is correct
11 Correct 0 ms 1564 KB Output is correct
12 Incorrect 0 ms 1564 KB Output isn't correct
13 Halted 0 ms 0 KB -