結果

問題 No.1055 牛歩
ユーザー yosupotyosupot
提出日時 2020-05-15 22:00:29
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 10,553 bytes
コンパイル時間 1,275 ms
コンパイル使用メモリ 125,624 KB
実行使用メモリ 10,468 KB
最終ジャッジ日時 2024-09-22 09:03:34
合計ジャッジ時間 12,091 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 AC 408 ms
10,448 KB
testcase_02 AC 299 ms
6,940 KB
testcase_03 AC 298 ms
6,944 KB
testcase_04 AC 299 ms
6,940 KB
testcase_05 AC 299 ms
6,940 KB
testcase_06 AC 357 ms
6,940 KB
testcase_07 AC 356 ms
6,940 KB
testcase_08 AC 355 ms
6,944 KB
testcase_09 AC 286 ms
6,944 KB
testcase_10 AC 289 ms
6,944 KB
testcase_11 AC 288 ms
6,944 KB
testcase_12 AC 141 ms
6,944 KB
testcase_13 AC 141 ms
6,940 KB
testcase_14 AC 284 ms
6,944 KB
testcase_15 AC 285 ms
6,944 KB
testcase_16 AC 82 ms
6,940 KB
testcase_17 AC 244 ms
6,940 KB
testcase_18 AC 244 ms
6,940 KB
testcase_19 AC 244 ms
6,944 KB
testcase_20 AC 110 ms
6,940 KB
testcase_21 AC 324 ms
6,944 KB
testcase_22 AC 345 ms
6,940 KB
testcase_23 AC 111 ms
6,940 KB
testcase_24 AC 267 ms
6,944 KB
testcase_25 AC 2 ms
6,944 KB
testcase_26 AC 48 ms
6,944 KB
testcase_27 AC 47 ms
6,944 KB
testcase_28 AC 76 ms
6,944 KB
testcase_29 AC 2 ms
6,940 KB
testcase_30 AC 80 ms
6,940 KB
testcase_31 AC 75 ms
6,940 KB
testcase_32 AC 3 ms
6,940 KB
testcase_33 AC 80 ms
6,940 KB
testcase_34 AC 3 ms
6,940 KB
testcase_35 AC 80 ms
6,940 KB
testcase_36 AC 80 ms
6,940 KB
testcase_37 AC 4 ms
6,944 KB
testcase_38 AC 5 ms
6,944 KB
testcase_39 AC 3 ms
6,944 KB
testcase_40 AC 8 ms
6,944 KB
testcase_41 AC 4 ms
6,944 KB
testcase_42 AC 6 ms
6,944 KB
testcase_43 AC 5 ms
6,944 KB
testcase_44 AC 4 ms
6,940 KB
testcase_45 AC 8 ms
6,944 KB
testcase_46 AC 3 ms
6,940 KB
testcase_47 AC 8 ms
6,940 KB
testcase_48 AC 2 ms
6,940 KB
testcase_49 AC 2 ms
6,944 KB
testcase_50 AC 2 ms
6,940 KB
testcase_51 AC 2 ms
6,944 KB
testcase_52 AC 2 ms
6,944 KB
testcase_53 AC 2 ms
6,944 KB
testcase_54 AC 2 ms
6,944 KB
testcase_55 AC 2 ms
6,944 KB
testcase_56 AC 2 ms
6,944 KB
testcase_57 AC 2 ms
6,940 KB
testcase_58 AC 2 ms
6,944 KB
testcase_59 AC 2 ms
6,944 KB
testcase_60 AC 3 ms
6,944 KB
testcase_61 AC 2 ms
6,944 KB
testcase_62 AC 2 ms
6,944 KB
testcase_63 AC 3 ms
6,940 KB
testcase_64 AC 2 ms
6,944 KB
testcase_65 AC 2 ms
6,940 KB
testcase_66 AC 2 ms
6,940 KB
testcase_67 AC 2 ms
6,940 KB
testcase_68 AC 2 ms
6,940 KB
testcase_69 AC 2 ms
6,940 KB
testcase_70 AC 2 ms
6,944 KB
testcase_71 AC 2 ms
6,944 KB
testcase_72 AC 2 ms
6,944 KB
testcase_73 AC 2 ms
6,940 KB
testcase_74 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx")
//#undef LOCAL




#include <algorithm>

#include <array>

#include <bitset>

#include <cassert>

#include <complex>

#include <cstdio>

#include <cstring>

#include <iostream>

#include <map>

#include <numeric>

#include <queue>

#include <set>

#include <string>

#include <unordered_map>

#include <unordered_set>

#include <vector>

using namespace std;

using uint = unsigned int;
using ll = long long;
using ull = unsigned long long;
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
template <class T> using V = vector<T>;
template <class T> using VV = V<V<T>>;

struct Scanner {
    FILE* fp = nullptr;
    char line[(1 << 15) + 1];
    size_t st = 0, ed = 0;
    void reread() {
        memmove(line, line + st, ed - st);
        ed -= st;
        st = 0;
        ed += fread(line + ed, 1, (1 << 15) - ed, fp);
        line[ed] = '\0';
    }
    bool succ() {
        while (true) {
            if (st == ed) {
                reread();
                if (st == ed) return false;
            }
            while (st != ed && isspace(line[st])) st++;
            if (st != ed) break;
        }
        if (ed - st <= 50) reread();
        return true;
    }
    template <class T, enable_if_t<is_same<T, string>::value, int> = 0>
    bool read_single(T& ref) {
        if (!succ()) return false;
        while (true) {
            size_t sz = 0;
            while (st + sz < ed && !isspace(line[st + sz])) sz++;
            ref.append(line + st, sz);
            st += sz;
            if (!sz || st != ed) break;
            reread();
        }
        return true;
    }
    template <class T, enable_if_t<is_integral<T>::value, int> = 0>
    bool read_single(T& ref) {
        if (!succ()) return false;
        bool neg = false;
        if (line[st] == '-') {
            neg = true;
            st++;
        }
        ref = T(0);
        while (isdigit(line[st])) {
            ref = 10 * ref + (line[st++] - '0');
        }
        if (neg) ref = -ref;
        return true;
    }
    template <class T> bool read_single(V<T>& ref) {
        for (auto& d : ref) {
            if (!read_single(d)) return false;
        }
        return true;
    }
    void read() {}
    template <class H, class... T> void read(H& h, T&... t) {
        bool f = read_single(h);
        assert(f);
        read(t...);
    }
    Scanner(FILE* _fp) : fp(_fp) {}
};

struct Printer {
  public:
    template <bool F = false> void write() {}
    template <bool F = false, class H, class... T>
    void write(const H& h, const T&... t) {
        if (F) write_single(' ');
        write_single(h);
        write<true>(t...);
    }
    template <class... T> void writeln(const T&... t) {
        write(t...);
        write_single('\n');
    }

    Printer(FILE* _fp) : fp(_fp) {}
    ~Printer() { flush(); }

  private:
    static constexpr size_t SIZE = 1 << 15;
    FILE* fp;
    char line[SIZE], small[50];
    size_t pos = 0;
    void flush() {
        fwrite(line, 1, pos, fp);
        pos = 0;
    }
    void write_single(const char& val) {
        if (pos == SIZE) flush();
        line[pos++] = val;
    }
    template <class T, enable_if_t<is_integral<T>::value, int> = 0>
    void write_single(T val) {
        if (pos > (1 << 15) - 50) flush();
        if (val == 0) {
            write_single('0');
            return;
        }
        if (val < 0) {
            write_single('-');
            val = -val; // todo min
        }
        size_t len = 0;
        while (val) {
            small[len++] = char('0' + (val % 10));
            val /= 10;
        }
        for (size_t i = 0; i < len; i++) {
            line[pos + i] = small[len - 1 - i];
        }
        pos += len;
    }
    void write_single(const string& s) {
        for (char c : s) write_single(c);
    }
    void write_single(const char* s) {
        size_t len = strlen(s);
        for (size_t i = 0; i < len; i++) write_single(s[i]);
    }
    template <class T> void write_single(const V<T>& val) {
        auto n = val.size();
        for (size_t i = 0; i < n; i++) {
            if (i) write_single(' ');
            write_single(val[i]);
        }
    }
};




template <class D, class Op> struct SimpleSeg {
    D e;
    Op op;
    int n, sz, lg; // size(extended to 2^i), lg
    V<D> d;

    SimpleSeg(const V<D>& v, D _e, Op _op) : e(_e), op(_op) {
        n = int(v.size());
        lg = 1;
        while ((1 << lg) < n) lg++;
        sz = 1 << lg;
        d = V<D>(2 * sz, e);
        for (int i = 0; i < n; i++) d[sz + i] = v[i];
        for (int i = sz - 1; i >= 0; i--) {
            update(i);
        }
    }

    void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }

    void set(int p, D x) {
        assert(0 <= p && p < n);
        p += sz;
        d[p] = x;
        for (int i = 1; i <= lg; i++) update(p >> i);
    }

    D single(int p) const {
        assert(0 <= p && p < n);
        return d[p + sz];
    }

    D sum(int a, int b) const {
        assert(a <= b);
        D sml = e, smr = e;
        a += sz;
        b += sz;

        while (a < b) {
            if (a & 1) sml = op(sml, d[a++]);
            if (b & 1) smr = op(d[--b], smr);
            a >>= 1;
            b >>= 1;
        }
        return op(sml, smr);
    }

    D all_sum() const {
        return d[1];
    }

    // min i s.t. f(d[a] + d[a+1] + ... d[i]) == true (or return n + 1)
    template <class Comp> int search_left(int a, Comp f) {
        a += sz;
        D sm = e;
        if (f(e)) return a;
        while (true) {
            if (f(op(sm, d[a]))) {
                while (a < sz) {
                    a *= 2;
                    if (!f(op(sm, d[a]))) {
                        sm = op(sm, d[a]);
                        a++;
                    }
                }
                a = a + 1 - sz;
                return a;
            }
            if (a & 1) {
                sm = op(sm, d[a]);
                a++;
                if ((a & -a) == a) break;
            }
            a >>= 1;
        }
        return n + 1;
    }
};

template <class D, class Op>
SimpleSeg<D, Op> get_simple_seg(V<D> v, D e, Op op) {
    return SimpleSeg<D, Op>(v, e, op);
}

template <class D, class L, class OpDD, class OpDL, class OpLL> struct SegTree {
    D e_d;
    L e_l;
    OpDD op_dd;
    OpDL op_dl;
    OpLL op_ll;
    int sz, lg; //(2^lgに拡張後の)サイズ, lg
    V<D> d;
    V<L> lz;

    SegTree(const V<D>& v,
            D _e_d,
            L _e_l,
            OpDD _op_dd,
            OpDL _op_dl,
            OpLL _op_ll)
        : e_d(_e_d), e_l(_e_l), op_dd(_op_dd), op_dl(_op_dl), op_ll(_op_ll) {
        int n = int(v.size());
        lg = 1;
        while ((1 << lg) < n) lg++;
        sz = 1 << lg;
        d = V<D>(2 * sz, e_d);
        lz = V<L>(2 * sz, e_l);
        for (int i = 0; i < n; i++) d[sz + i] = v[i];
        for (int i = sz - 1; i >= 0; i--) {
            update(i);
        }
    }

    void all_add(int k, L x) {
        d[k] = op_dl(d[k], x);
        lz[k] = op_ll(lz[k], x);
    }
    void push(int k) {
        all_add(2 * k, lz[k]);
        all_add(2 * k + 1, lz[k]);
        lz[k] = e_l;
    }
    void update(int k) { d[k] = op_dd(d[2 * k], d[2 * k + 1]); }

    void set(int p, D x) {
        p += sz;
        for (int i = lg; i >= 1; i--) push(p >> i);
        d[p] = x;
        for (int i = 1; i <= lg; i++) update(p >> i);
    }

    void add(int a, int b, L x, int l, int r, int k) {
        if (b <= l || r <= a) return;
        if (a <= l && r <= b) {
            all_add(k, x);
            return;
        }
        push(k);
        int mid = (l + r) / 2;
        add(a, b, x, l, mid, 2 * k);
        add(a, b, x, mid, r, 2 * k + 1);
        update(k);
    }
    void add(int a, int b, L x) { add(a, b, x, 0, sz, 1); }

    D single(int p) {
        p += sz;
        for (int i = lg; i >= 1; i--) push(p >> i);
        return d[p];
    }

    D sum(int a, int b, int l, int r, int k) {
        if (b <= l || r <= a) return e_d;
        if (a <= l && r <= b) return d[k];
        push(k);
        int mid = (l + r) / 2;
        return op_dd(sum(a, b, l, mid, 2 * k), sum(a, b, mid, r, 2 * k + 1));
    }
    D sum(int a, int b) { return sum(a, b, 0, sz, 1); }

    D all_sum() const { return d[1]; }
};

template <class D, class L, class OpDD, class OpDL, class OpLL>
SegTree<D, L, OpDD, OpDL, OpLL> get_seg(V<D> v,
                                        D e_d,
                                        L e_l,
                                        OpDD op_dd,
                                        OpDL op_dl,
                                        OpLL op_ll) {
    return SegTree<D, L, OpDD, OpDL, OpLL>(v, e_d, e_l, op_dd, op_dl, op_ll);
}

Scanner sc = Scanner(stdin);
Printer pr = Printer(stdout);

struct D {
    int a, b, c;
    bool emp = false;
    int f(int x) const {
        if (x <= a) return b;
        if (c <= x) return TEN(9);
        return (x - a + 1) / 2 * 2 + b;
    }
};

ostream& operator<<(ostream& os, const D& d) {
    return os << "D(" << d.a << " " << d.b << " " << d.c << ")";
}

D mrg(D x, D y) {
    if (x.emp) return y;
    if (y.emp) return x;
    D z;
    z.b = y.f(x.f(-1));
    if (z.b == TEN(9)) {
        return {-TEN(9), -1, -TEN(9)};
    }
    int lw = -1, up = TEN(9);
    while (up - lw > 1) {
        int md = (lw + up) / 2;
        if (y.f(x.f(md)) != z.b) {
            up = md;
        } else {
            lw = md;
        }
    }
    z.a = lw;
    lw = -1; up = TEN(9);
    while (up - lw > 1) {
        int md = (lw + up) / 2;
        if (y.f(x.f(md)) == TEN(9)) {
            up = md;
        } else {
            lw = md;
        }
    }
    z.c = up;
    return z;
}

int main() {
    int n, m;
    sc.read(n, m);

    V<int> lw(n), up(n);
    for (int i = 0; i < m; i++) {
        sc.read(lw[i]); lw[i]--;
        up[i] = lw[i];
    }
    auto get_d = [&](int i) {
        return D{lw[i], lw[i] + 1, up[i] + 1};
    };

    auto seg = get_simple_seg(V<D>(m), {-1, -1, -1, true}, [&](D a, D b) {
        return mrg(a, b);
    });

    for (int i = 0; i < m; i++) {
        seg.set(i, get_d(i));
    }

                      ;
    int q;
    sc.read(q);
    for (int ph = 0; ph < q; ph++) {
        int b;
        sc.read(b); b--;
        lw[b]--; up[b]++;
        seg.set(b, get_d(b));
        if (seg.all_sum().f(0) > n) {
            pr.writeln("NO");
            return 0;
        }
                                              ;
    }
    pr.writeln("YES");
    return 0;
}
0