Submission #1560833


Source Code Expand

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <climits>
#include <locale>
#include <iostream>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#define REP(i,n) for(int i=0;i<(int)(n);i++)
#define ALL(x) (x).begin(),(x).end()

using namespace std;

using ll = long long;
using ld = long double;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> int len(const T &x) { return x.size(); }

template<typename T>
vector<T> table(int n, T v) { return vector<T>(n, v); }

template <class... Args>
auto table(int n, Args... args) {
  auto val = table(args...);
  return vector<decltype(val)>(n, move(val));
}

struct yes_no : numpunct<char> {
  string_type do_truename()  const { return "YES"; }
  string_type do_falsename() const { return "NO"; }
};

template <class Monoid>
class SegmentTree {
  using T = typename Monoid::type;
  const int sz, n;
  std::vector<T> data;
  int expand(int n) const { return n == 1 ? n : expand((n + 1) / 2) * 2; }
public:
  SegmentTree(const std::vector<T> &init) :
    sz(init.size()), n(expand(sz)), data(n * 2, Monoid::id()) {
    std::copy(begin(init), end(init), begin(data) + n);
    for (int i = n - 1; i >= 0; --i) {
      data[i] = Monoid::op(data[i * 2 + 0], data[i * 2 + 1]);
    }
  }
  SegmentTree(const int n, const T &init = Monoid::id()) :
    SegmentTree(std::vector<T>(n, init)) {}
  int size() const { return sz; }
  void update(int p, T val) {
    assert (0 <= p && p < sz); // assertion
    data[p += n] = val;
    while (p /= 2) data[p] = Monoid::op(data[p * 2], data[p * 2 + 1]);
  }
  T query(int l, int r) const {
    assert (0 <= l && l <= r && r <= sz); // assertion
    l += n; r += n;
    T res1 = Monoid::id(), res2 = Monoid::id();
    while (l != r) {
      if (l % 2) res1 = Monoid::op(res1, data[l++]);
      if (r % 2) res2 = Monoid::op(data[--r], res2);
      l /= 2; r /= 2;
    }
    return Monoid::op(res1, res2);
  }
};

struct MinQ {
  using type = int;
  static type id() { return INT_MAX; }
  static type op(const type &l, const type &r) { return min(l, r); }
};

struct MaxQ {
  using type = int;
  static type id() { return INT_MIN; }
  static type op(const type &l, const type &r) { return max(l, r); }
};

int T[128000];
int A[128000];
int B[128000];

void solve(ll X, ll K, vector<ll> r, ll Q, vector<ll> t, vector<ll> a) {
  T[0] = 0; A[0] = 0; B[0] = 0;
  T[K+1] = 11e8;
  REP(i,K) {
    T[i+1] = r[i];
    if (i % 2 == 0) A[i+1] = A[i] - (T[i+1] - T[i]);
    else A[i+1] = A[i] + (T[i+1] - T[i]);
    if (i % 2 == 0) B[i+1] = B[i] - (T[i+1] - T[i]);
    else B[i+1] = B[i] + (T[i+1] - T[i]);
    chmin(B[i+1], int(X));
    chmax(B[i+1], 0);
  }
  SegmentTree<MinQ> minq(K+1);
  SegmentTree<MaxQ> maxq(K+1);
  REP(i,K+1) minq.update(i, A[i]);
  REP(i,K+1) maxq.update(i, A[i]);
  REP(i,Q) {
    int it = upper_bound(T, T + K + 2, t[i]) - T - 1;
    int res = 0;
    int mi = minq.query(0, it + 1);
    int ma = maxq.query(0, it + 1);
    if (ma - mi >= X) res = B[it];
    else if (ma + a[i] >= X) res = a[i] + A[it] - (ma + a[i] - X);
    else if (mi + a[i] <= 0) res = a[i] + A[it] + (0 - mi - a[i]);
    else res = A[it] + a[i];
    if (it % 2 == 0) res -= t[i] - T[it];
    else res += t[i] - T[it];
    chmin(res, int(X));
    chmax(res, 0);
    cout << res << endl;
  }
}

int main() {
  locale loc(locale(), new yes_no);
  cout << boolalpha << setprecision(12) << fixed;
  cout.imbue(loc);
	ll Q;
	ll X;
	ll K;
	scanf("%lld", &X);
	scanf("%lld", &K);
	vector<ll> r(K-1+1);
	for (int i = 0 ; i <= K-1 ; i++) {
	  scanf("%lld", &r[i]);
	}
	scanf("%lld", &Q);
	vector<ll> a(Q-1+1);
	vector<ll> t(Q-1+1);
	for (int i = 0 ; i <= Q-1 ; i++) {
	  scanf("%lld", &t[i]);
	  scanf("%lld", &a[i]);
	}
	solve(X, K, r, Q, t, a);
	return 0;
}

Submission Info

Submission Time
Task F - Sandglass
User asi1024
Language C++14 (GCC 5.4.1)
Score 700
Code Size 4374 Byte
Status AC
Exec Time 213 ms
Memory 9592 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:147:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld", &X);
                   ^
./Main.cpp:148:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld", &K);
                   ^
./Main.cpp:151:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    scanf("%lld", &r[i]);
                        ^
./Main.cpp:153:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld", &Q);
                   ^
./Main.cpp:157:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    scanf("%lld", &t[i]);
                        ^
./Main.cpp:158:24: warning...

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 700 / 700
Status
AC × 3
AC × 42
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 1_003.txt, 1_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 1_033.txt, 1_034.txt, 1_035.txt, 1_036.txt, 1_037.txt, 1_038.txt, 1_039.txt, 1_040.txt, 1_041.txt
Case Name Status Exec Time Memory
0_000.txt AC 1 ms 256 KB
0_001.txt AC 1 ms 256 KB
0_002.txt AC 1 ms 256 KB
1_003.txt AC 203 ms 8696 KB
1_004.txt AC 204 ms 8696 KB
1_005.txt AC 206 ms 8696 KB
1_006.txt AC 203 ms 8824 KB
1_007.txt AC 205 ms 8824 KB
1_008.txt AC 206 ms 8824 KB
1_009.txt AC 204 ms 8824 KB
1_010.txt AC 209 ms 8824 KB
1_011.txt AC 206 ms 8824 KB
1_012.txt AC 204 ms 8952 KB
1_013.txt AC 204 ms 8952 KB
1_014.txt AC 207 ms 8952 KB
1_015.txt AC 203 ms 9080 KB
1_016.txt AC 204 ms 9080 KB
1_017.txt AC 202 ms 8952 KB
1_018.txt AC 206 ms 9080 KB
1_019.txt AC 207 ms 9080 KB
1_020.txt AC 213 ms 9080 KB
1_021.txt AC 203 ms 9080 KB
1_022.txt AC 206 ms 9208 KB
1_023.txt AC 208 ms 9208 KB
1_024.txt AC 204 ms 9080 KB
1_025.txt AC 208 ms 9336 KB
1_026.txt AC 211 ms 9336 KB
1_027.txt AC 205 ms 9080 KB
1_028.txt AC 205 ms 9208 KB
1_029.txt AC 211 ms 9464 KB
1_030.txt AC 206 ms 9208 KB
1_031.txt AC 209 ms 9208 KB
1_032.txt AC 212 ms 9592 KB
1_033.txt AC 175 ms 4224 KB
1_034.txt AC 179 ms 4224 KB
1_035.txt AC 209 ms 9336 KB
1_036.txt AC 176 ms 4224 KB
1_037.txt AC 181 ms 4352 KB
1_038.txt AC 212 ms 9464 KB
1_039.txt AC 175 ms 3968 KB
1_040.txt AC 180 ms 4352 KB
1_041.txt AC 213 ms 9592 KB