結果

問題 No.865 24時間降水量
ユーザー rokahikou1rokahikou1
提出日時 2020-09-04 17:46:21
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,651 bytes
コンパイル時間 1,680 ms
コンパイル使用メモリ 175,116 KB
実行使用メモリ 16,256 KB
最終ジャッジ日時 2024-11-26 08:26:59
合計ジャッジ時間 4,632 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 AC 2 ms
5,248 KB
testcase_19 AC 2 ms
5,248 KB
testcase_20 AC 2 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int(i) = 0; (i) < (n); (i)++)
#define FOR(i, m, n) for(int(i) = (m); (i) < (n); (i)++)
#define All(v) (v).begin(), (v).end()
#define pb push_back
#define MP(a, b) make_pair((a), (b))
template <class T> vector<T> make_vec(size_t a, T val) {
    return vector<T>(a, val);
}
template <class... Ts> auto make_vec(size_t a, Ts... ts) {
    return vector<decltype(make_vec(ts...))>(a, make_vec(ts...));
}
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using Graph = vector<vector<int>>;
template <typename T> struct edge {
    int to;
    T cost;
    edge(int t, T c) : to(t), cost(c) {}
};
template <typename T> using WGraph = vector<vector<edge<T>>>;
const int INF = 1 << 30;
const ll LINF = 1LL << 60;
const int MOD = 1e9 + 7;

// Range Sum Query by LazySegmentTree
struct LazySegTree {
  private:
    int n;
    vector<ll> node, lazy;

  public:
    LazySegTree(vector<ll> v) {
        int sz = (int)v.size();
        n = 1;
        while(n < sz)
            n *= 2;
        node.resize(2 * n - 1);
        lazy.resize(2 * n - 1, 0);

        for(int i = 0; i < sz; i++)
            node[i + n - 1] = v[i];
        for(int i = n - 2; i >= 0; i--)
            node[i] = max(node[i * 2 + 1], node[i * 2 + 2]);
    }

    // k番目のノードについて遅延評価
    void eval(int k, int l, int r) {
        // 遅延配列を見て空でなかったら値を伝播
        if(lazy[k] != 0) {
            node[k] += lazy[k];
            // 最下段かどうかチェック
            // 伝播
            if(r - l > 1) {
                lazy[2 * k + 1] += lazy[k] / 2;
                lazy[2 * k + 2] += lazy[k] / 2;
            }
        }

        // 伝播の終了
        lazy[k] = 0;
    }

    ll at(int k) { return getsum(k, k + 1); }

    // [a,b)区間加算
    void add(int a, int b, ll x, int k = 0, int l = 0, int r = -1) {
        if(r < 0)
            r = n;
        // まず評価
        eval(k, l, r);
        // 範囲外なら何もしない
        if(b <= l || r <= a)
            return;

        // 完全に被覆 遅延配列に値を入れ評価
        if(a <= l && r <= b) {
            lazy[k] += (r - l) * x;
            eval(k, l, r);
        }
        // そうでないとき 子コードの値を再帰的に計算して計算済みの値をもってくる
        else {
            add(a, b, x, 2 * k + 1, l, (l + r) / 2);
            add(a, b, x, 2 * k + 2, (l + r) / 2, r);
            node[k] = max(node[2 * k + 1], node[2 * k]);
        }
    }

    // [a,b)区間取得
    ll getsum(int a, int b, int k = 0, int l = 0, int r = -1) {
        if(r < 0)
            r = n;
        if(b <= l || r <= a)
            return 0;

        // まず評価
        eval(k, l, r);
        if(a <= l && r <= b)
            return node[k];
        ll vl = getsum(a, b, 2 * k + 1, l, (l + r) / 2);
        ll vr = getsum(a, b, 2 * k + 2, (l + r) / 2, r);
        return max(vl, vr);
    }
};

int main() {
    int N;
    cin >> N;
    vector<ll> A(N);
    rep(i, N) cin >> A[i];
    ll tmp = 0;
    rep(i, 24) tmp += A[i];
    vector<ll> B(N - 24 + 1);
    for(int i = 0; i < B.size(); i++) {
        B[i] = tmp;
        tmp -= A[i];
        if(i + 24 < N)
            tmp += A[i + 24];
    }
    LazySegTree seg(B);
    int Q;
    cin >> Q;
    rep(i, Q) {
        int t, v;
        cin >> t >> v;
        t--;
        ll dif = v - A[t];
        A[t] = v;
        int l = max(0, t - 24 + 1);
        int r = min((int)B.size(), t + 1);
        seg.add(l, r, dif);
        cout << seg.getsum(0, B.size()) << endl;
    }
}
0