結果

問題 No.1170 Never Want to Walk
ユーザー zeronosu77108zeronosu77108
提出日時 2020-08-14 23:00:01
言語 C++17(clang)
(17.0.6 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,418 bytes
コンパイル時間 1,236 ms
コンパイル使用メモリ 131,108 KB
実行使用メモリ 22,104 KB
最終ジャッジ日時 2024-10-10 16:20:17
合計ジャッジ時間 10,956 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 WA -
testcase_03 AC 2 ms
5,248 KB
testcase_04 WA -
testcase_05 AC 2 ms
5,248 KB
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 AC 2 ms
5,248 KB
testcase_10 AC 1 ms
5,248 KB
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
testcase_35 WA -
testcase_36 WA -
testcase_37 WA -
testcase_38 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct LazySegmentTree {
private:
    int n;
    vector<long> node, lazy;

public:
    LazySegmentTree(vector<long> 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] = 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];

            // 最下段かどうかのチェックをしよう
            // 子ノードは親ノードの 1/2 の範囲であるため、
            // 伝播させるときは半分にする
            if(r - l > 1) {
                lazy[2*k+1] += lazy[k] / 2;
                lazy[2*k+2] += lazy[k] / 2;
            }

            // 伝播が終わったので、自ノードの遅延配列を空にする
            lazy[k] = 0;
        }
    }

    void add(int a, int b, long x, int k=0, int l=0, int r=-1) {
        if(r < 0) r = n;

        // k 番目のノードに対して遅延評価を行う
        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] = node[2*k+1] + node[2*k+2];
        }
    }

    long 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];
        long vl = getsum(a, b, 2*k+1, l, (l+r)/2);
        long vr = getsum(a, b, 2*k+2, (l+r)/2, r);
        return vl + vr;
    }
};


int main() {
    int n,a,b;
    cin >> n >> a >> b;
    vector x(n,0);
    for (int i=0; i<n; i++) cin >> x[i];
    LazySegmentTree rseg(vector(n,0L));
    LazySegmentTree lseg(vector(n,0L));

    cerr<<"calc1"<<endl;
    for (int i=0; i<n; i++) {
        auto l = lower_bound(x.begin(), x.end(), x[i]+a);
        auto r = upper_bound(x.begin(), x.end(), x[i]+b);
        int lindex = l - x.begin();
        int rindex = r - x.begin();
//        cerr<< lindex << " " << rindex<<endl;
        rseg.add(lindex, rindex, rindex-lindex + rseg.getsum(i,i+1));
    }
    cerr<<"calc2"<<endl;
    for (int i=n-1; i>=0; i--) {
        auto l = lower_bound(x.begin(), x.end(), x[i]-b);
        auto r = upper_bound(x.begin(), x.end(), x[i]-a);
        int lindex = l - x.begin();
        int rindex = r - x.begin();
//        cerr<< lindex << " " << rindex<<endl;
        lseg.add(lindex, rindex, rindex-lindex + lseg.getsum(i,i+1));
    }


    cerr<<"ans"<<endl;
    for (int i=0; i<n; i++) {
        cout <<  lseg.getsum(i,i+1) + rseg.getsum(i, i+1) + 1 << endl;
    }
}
0