提出 #71339036


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define fi first
#define se second

#ifdef reimufumo
#define owo(x) cerr << x
#else
#define owo(x) (void(0))
#endif

struct SegmentTree {
    struct Node {
        ll val = 1;
        set<ll> ind;
        ll ls = -1;
        ll rs = -1;
        ll lazy = -1;
        set<array<ll, 2>> lazyind;
    };
    vector<Node> d;
    ll idx = 0;
    
    const ll n;
    vector<ll> a;

    void pushup(ll p) {
        d[p].val = d[d[p].ls].val + d[d[p].rs].val;
    }
    
    void pushdown(ll s, ll t, ll p) {
        if (d[p].ls == -1) {
            d[p].ls = ++idx;
            d.push_back(Node());
        }
        if (d[p].rs == -1) {
            d[p].rs = ++idx;
            d.push_back(Node());
        }

        d[d[p].ls].val += d[p].lazy;
        for (auto [x, o] : d[p].lazyind) {
            if (o) {
                d[d[p].ls].ind.insert(x);
            } else {
                d[d[p].ls].ind.erase(x);
            }
            d[d[p].ls].lazyind.insert({x, o});
        }
        d[d[p].ls].lazy += d[p].lazy;
        d[d[p].rs].val += d[p].lazy;
        d[d[p].rs].ind = d[p].ind;
        d[d[p].rs].lazy += d[p].lazy;
        for (auto [x, o] : d[p].lazyind) {
            if (o) {
                d[d[p].rs].ind.insert(x);
            } else {
                d[d[p].rs].ind.erase(x);
            }
            d[d[p].rs].lazyind.insert({x, o});
        }
        d[p].lazy = 0;
    }
    
    void build(ll s, ll t, ll p) {
        if (s == t) {
            d[p].val = a[s];
            d[p].lazy = 0;
            return;
        }
        ll mid = s + (t - s) / 2ll;
        pushdown(s, t, p);
        build(s, mid, d[p].ls);
        build(mid + 1, t, d[p].rs);
        pushup(p);
    }
    
    void update(ll l, ll r, ll c, ll ind, ll s, ll t, ll p) {
        if (l <= s && t <= r) {
            d[p].val += c;
            if (c == 1) d[p].ind.insert(ind);
            else d[p].ind.erase(ind);
            d[p].lazy += c;
            if (c == 1) d[p].lazyind.insert({ind, 1});
            else d[p].lazyind.insert({ind, -1});
            return;
        }
        ll mid = s + (t - s) / 2ll;
        pushdown(s, t, p);
        if (l <= mid) update(l, r, c, ind, s, mid, d[p].ls);
        if (r > mid) update(l, r, c, ind, mid + 1, t, d[p].rs);
        pushup(p);
    }
    
    pair<ll, set<ll>> getsum(ll l, ll r, ll s, ll t, ll p) {
        if (l <= s && t <= r) return {d[p].val, d[p].ind};
        ll mid = s + (t - s) / 2ll;
        pair<ll, set<ll>> ret; ret.fi = 0;
        pushdown(s, t, p);
        if (l <= mid) {
            pair<ll, set<ll>> now = getsum(l, r, s, mid, d[p].ls);
            ret.fi += now.fi; ret.se = now.se;
        }
        if (r > mid) {
            pair<ll, set<ll>> now = getsum(l, r, mid + 1, t, d[p].rs);
            ret.fi += now.fi, ret.se = now.se;
        }
        pushup(p);
        return ret;
    }
    
    SegmentTree(ll _n, vector<ll> _a) : n(_n), a(_a) {
        d.push_back(Node());
        build(1, n, 0);
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    ll n; cin >> n;
    array<ll, 4> clouds[n + 1];
    priority_queue<array<ll, 2>> rowin, rowout;
    for (int i = 1; i <= n; i++) {
        ll u, d, l, r;
        cin >> u >> d >> l >> r;
        clouds[i] = {u, d, l, r};
        rowin.push({-u, i});
        rowout.push({-d, i});
    }

    SegmentTree segtree(2000, vector<ll>(2001));
    
    ll covered = 0, cnt[n + 1];
    memset(cnt, 0, sizeof(cnt));
    for (int row = 1; row <= 7; row++) {
        while (!rowin.empty() && row == -rowin.top()[0]) {
            ll ind = rowin.top()[1]; rowin.pop();
            segtree.update(clouds[ind][2], clouds[ind][3], 1, ind, 1, 2000, 0);

            #ifdef reimufumo
            cerr << clouds[ind][2] << ' ' << clouds[ind][3] << '\n';
            #endif
        }

        #ifdef reimufumo
        cerr << row << "; " << -rowin.top()[0] << ' ' << -rowout.top()[0] << ": ";
        //for (auto [u, ind]: cur) cerr << u << ", " << ind << "; ";
        cerr << '\n';
        #endif

        for (int col = 1; col <= 7; col++) {
            auto [num, ind] = segtree.getsum(col, col, 1, 2000, 0);
            if (num == 1) cnt[*ind.begin()]++;
            if (num >= 1) covered++;

            #ifdef reimufumo
            cerr << row << ' ' << col << ' ' << num << ' ' << *ind.begin() << '\n';
            #endif
        }

        while (!rowout.empty() && row == -rowout.top()[0]) {
            ll ind = rowout.top()[1]; rowout.pop();
            segtree.update(clouds[ind][2], clouds[ind][3], -1, ind, 1, 2000, 0);
        }
    }


    for (int i = 1; i <= n; i++) {
        cout << 2000 * 2000 - covered + cnt[i] << '\n';
    }
}

提出情報

提出日時
問題 D - Clouds
ユーザ lumid
言語 C++23 (GCC 15.2.0)
得点 0
コード長 4980 Byte
結果 WA
実行時間 > 2000 ms
メモリ 692768 KiB

コンパイルエラー

./Main.cpp: In member function 'void SegmentTree::pushdown(ll, ll, ll)':
./Main.cpp:34:22: warning: unused parameter 's' [-Wunused-parameter]
   34 |     void pushdown(ll s, ll t, ll p) {
      |                   ~~~^
./Main.cpp:34:28: warning: unused parameter 't' [-Wunused-parameter]
   34 |     void pushdown(ll s, ll t, ll p) {
      |                         ~~~^

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 0 / 425
結果
WA × 1
AC × 1
WA × 49
TLE × 8
セット名 テストケース
Sample sample_01.txt
All sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt
ケース名 結果 実行時間 メモリ
sample_01.txt WA 2 ms 3956 KiB
test_01.txt AC 2 ms 3928 KiB
test_02.txt WA 40 ms 18436 KiB
test_03.txt TLE > 2000 ms 539808 KiB
test_04.txt TLE > 2000 ms 539820 KiB
test_05.txt TLE > 2000 ms 539780 KiB
test_06.txt TLE > 2000 ms 349196 KiB
test_07.txt TLE > 2000 ms 692768 KiB
test_08.txt WA 2 ms 4272 KiB
test_09.txt WA 189 ms 35920 KiB
test_10.txt WA 54 ms 20384 KiB
test_11.txt WA 164 ms 34272 KiB
test_12.txt WA 23 ms 12172 KiB
test_13.txt WA 2 ms 3928 KiB
test_14.txt WA 3 ms 4692 KiB
test_15.txt WA 2 ms 4060 KiB
test_16.txt WA 2 ms 4128 KiB
test_17.txt WA 11 ms 7856 KiB
test_18.txt WA 13 ms 8604 KiB
test_19.txt WA 1 ms 4076 KiB
test_20.txt WA 1 ms 3964 KiB
test_21.txt WA 1 ms 3988 KiB
test_22.txt WA 2 ms 4260 KiB
test_23.txt WA 1 ms 4040 KiB
test_24.txt WA 9 ms 7100 KiB
test_25.txt WA 3 ms 4548 KiB
test_26.txt WA 537 ms 84740 KiB
test_27.txt WA 3 ms 4456 KiB
test_28.txt WA 1 ms 4048 KiB
test_29.txt WA 1 ms 4088 KiB
test_30.txt WA 1 ms 3952 KiB
test_31.txt TLE > 2000 ms 264364 KiB
test_32.txt WA 2 ms 4128 KiB
test_33.txt WA 636 ms 104076 KiB
test_34.txt WA 1256 ms 131844 KiB
test_35.txt WA 141 ms 37252 KiB
test_36.txt WA 1103 ms 99208 KiB
test_37.txt WA 65 ms 25628 KiB
test_38.txt WA 75 ms 26896 KiB
test_39.txt WA 119 ms 30468 KiB
test_40.txt WA 45 ms 19592 KiB
test_41.txt WA 80 ms 25476 KiB
test_42.txt WA 42 ms 18716 KiB
test_43.txt WA 41 ms 18748 KiB
test_44.txt WA 43 ms 18984 KiB
test_45.txt WA 43 ms 18572 KiB
test_46.txt WA 44 ms 18828 KiB
test_47.txt WA 40 ms 18456 KiB
test_48.txt WA 40 ms 18588 KiB
test_49.txt WA 40 ms 18432 KiB
test_50.txt WA 1165 ms 150016 KiB
test_51.txt TLE > 2000 ms 226688 KiB
test_52.txt WA 333 ms 68388 KiB
test_53.txt WA 455 ms 79384 KiB
test_54.txt WA 950 ms 101248 KiB
test_55.txt WA 1584 ms 205480 KiB
test_56.txt TLE > 2000 ms 266240 KiB
test_57.txt WA 510 ms 96564 KiB