QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#103786#5098. 第一代图灵机bashkort#0 322ms32836kbC++204.7kb2023-05-07 15:45:582024-05-26 02:50:59

Judging History

This is the latest submission verdict.

  • [2024-05-26 02:50:59]
  • Judged
  • Verdict: 0
  • Time: 322ms
  • Memory: 32836kb
  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-07 15:45:58]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

constexpr ll inf = 3e18;

struct Info {
    ll ans = 0, mn = inf;
};

Info operator+(const Info &a, const Info &b) {
    return {max(a.ans, b.ans), min(a.mn, b.mn)};
}

vector<ll> tag;
vector<Info> t;
int sz = 1;

void init(int n) {
    sz = 1 << __lg(n) + !!(n & (n - 1));
    tag.assign(sz << 1, -1), t.assign(sz << 1, Info());
}

void apply(int x, ll tg) {
    tag[x] = tg;
    t[x].ans = tg - t[x].mn;
}

void push(int x) {
    if (tag[x] != -1) {
        apply(x << 1, tag[x]);
        apply(x << 1 | 1, tag[x]);
        tag[x] = -1;
    }
}

void pull(int x) {
    t[x] = t[x << 1] + t[x << 1 | 1];
}

Info rangeQuery(int l, int r, int x = 1, int lx = 0, int rx = sz) {
    if (l >= rx || lx >= r) {
        return {};
    }
    if (l <= lx && rx <= r) {
        return t[x];
    }
    int mid = lx + rx >> 1;
    push(x);
    return rangeQuery(l, r, x << 1, lx, mid) + rangeQuery(l, r, x << 1 | 1, mid, rx);
}

void rangeApply(int l, int r, ll tg, int x = 1, int lx = 0, int rx = sz) {
    if (l >= rx || lx >= r) {
        return;
    }
    if (l <= lx && rx <= r) {
        return apply(x, tg);
    }
    int mid = lx + rx >> 1;
    push(x);
    rangeApply(l, r, tg, x << 1, lx, mid), rangeApply(l, r, tg, x << 1 | 1, mid, rx);
    pull(x);
}

namespace SegmentTree {
    vector<int> t;
    int sz = 1;

    void init(int n, vector<int> nxt) {
        sz = 1 << __lg(n) + !!(n & (n - 1));
        t.assign(sz << 1, 1e9);
        for (int i = 0; i < n; ++i) {
            t[i + sz] = nxt[i];
        }
        for (int i = sz - 1; i > 0; --i) {
            t[i] = min(t[i << 1], t[i << 1 | 1]);
        }
    }

    void modify(int x, int v) {
        t[x += sz] = v;
        while (x >>= 1) {
            t[x] = min(t[x << 1], t[x << 1 | 1]);
        }
    }

    int rangeMin(int l, int r) {
        int ans = 1e9;
        for (l += sz, r += sz; l < r; l >>= 1, r >>= 1) {
            if (l & 1) ans = min(ans, t[l++]);
            if (r & 1) ans = min(ans, t[--r]);
        }
        return ans;
    }

    int descend(int mn) { //find first such as nxt[i] < mn
        if (t[1] >= mn) {
            return -1;
        }

        int x = 1;

        while (x < sz) {
            if (t[x << 1 | 1] < mn) {
                x = x << 1 | 1;
            } else {
                x = x << 1;
            }
        }

        return x - sz;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, q;
    cin >> n >> m >> q;

    vector<ll> pref(n + 1);

    for (int i = 1; i <= n; ++i) {
        cin >> pref[i];
        pref[i] += pref[i - 1];
    }

    vector<int> c(n), nxt(n, n), last(m, -1);
    vector<set<int>> st(m);

    for (int i = 0; i < m; ++i) {
        st[i].insert(-1);
        st[i].insert(n);
    }

    for (int i = 0; i < n; ++i) {
        cin >> c[i];
        c[i] -= 1;
        st[c[i]].insert(i);

        if (last[c[i]] != -1) {
            nxt[last[c[i]]] = i;
        }
        last[c[i]] = i;
    }

    SegmentTree::init(n, nxt);

    init(n);

    for (int i = 0; i < n; ++i) {
        int r = SegmentTree::rangeMin(i, n);
        rangeApply(i, i + 1, pref[r]);
    }

    auto modify = [&](int x, int to) {
        SegmentTree::modify(x, to);

        int mn = SegmentTree::rangeMin(x, n);
        int j = SegmentTree::descend(mn) + 1;
        assert(j <= x);

        rangeApply(j, x + 1, pref[mn]);
    };

    auto replace = [&](int x, int col) {
        if (c[x] == col) {
            return;
        }

        st[c[x]].erase(x);
        st[col].insert(x);

        int p = *prev(st[c[x]].lower_bound(x));
        int np = *prev(st[col].lower_bound(x));
        int nx = *st[col].upper_bound(x);
        int npx = *st[c[x]].upper_bound(p);

        if (p != -1) {
            nxt[p] = npx;
            modify(p, npx);
        }

        if (np != -1) {
            nxt[np] = x;
            modify(np, x);
        }

        nxt[x] = nx;
        modify(x, nx);

        c[x] = col;
    };

    auto query = [&](int l, int r) { // [l, r)
        int i = SegmentTree::descend(r);
        if (i < l) {
            return pref[r] - pref[l];
        }
        ll ans = rangeQuery(l, i + 1).ans;
        ans = max(ans, pref[r] - pref[i + 1]);
        return ans;
    };

    while (q--) {
        int tp, a, b;
        cin >> tp >> a >> b;
        a -= 1, b -= 1;

        if (tp == 1) {
            cout << query(a, b + 1) << '\n';
        } else {
            replace(a, b);
        }
    }

    return 0;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 4352kb

input:

5000 200 5000
2315 3433 1793 4621 4627 4561 289 4399 3822 2392 392 4581 2643 2441 4572 4649 2981 3094 4206 2057 761 2516 2849 3509 3033 658 4965 3316 3269 4284 4961 753 1187 2515 1377 1725 4743 4761 3823 3464 4859 989 2401 953 875 1481 2181 103 2067 2625 3296 4721 61 3843 1607 997 4385 1284 4299 441...

output:

67541
58778
33803
58938
11164
10703
62583
58994
26972
47758
65135
58778
28520
40551
22795
37458
29906
42473
31218
19596
31813
83034
2491
39374
8900
7825
36179
36751
28882
45697
26397
9603
18013
42492
49892
48137
40939
29004
19023
26617
76644
23737
65135
52175
86780
14564
3478
35942
60731
12787
10819...

result:

wrong answer 1st lines differ - expected: '118571', found: '67541'

Subtask #2:

score: 0
Wrong Answer

Test #3:

score: 0
Wrong Answer
time: 322ms
memory: 29908kb

input:

200000 10 200000
55651 97298 108697 86619 60721 199951 10610 162267 154301 138848 39191 18605 101369 57073 34977 101576 71252 143401 89587 160521 166491 38442 150761 35579 25571 121311 38033 38483 144639 41401 179161 54872 157905 137601 46863 187656 171901 43715 41036 150741 69057 102031 130561 4772...

output:

242546
246276
229042
323913
208780
527584
256863
217872
203242
464855
311029
140161
499570
127740
158540
19201
236910
426385
532646
473600
413874
604105
246378
150601
301985
325155
184001
145708
438050
314732
402080
383452
502100
420311
55121
299933
592300
66608
566843
565801
310703
248417
393409
13...

result:

wrong answer 1st lines differ - expected: '1232419', found: '242546'

Subtask #3:

score: 0
Wrong Answer

Test #5:

score: 0
Wrong Answer
time: 259ms
memory: 32836kb

input:

200000 20000 200000
30681 32496 35471 48191 159123 69792 120915 150673 187226 158493 36275 26856 107976 124777 145229 69745 183961 14497 144808 153612 185893 137681 66417 46802 19345 113322 168046 128149 191001 135433 13201 139214 59489 81178 42343 163158 110121 119201 97501 53079 158755 192241 1132...

output:

14559272
2635783
22115493
9914559
14056109
10494927
22824217
13984831
20173766
11254829
19571799
11314060
21181225
12401677
9807825
11420631
1971342
18407213
19968177
11639959
15936127
18706769
7449540
5764679
7001413
30606653
2619603
11325193
6465645
16628617
9132683
9158736
27646800
12965499
21680...

result:

wrong answer 1st lines differ - expected: '46702944', found: '14559272'

Subtask #4:

score: 0
Skipped

Dependency #1:

0%

Subtask #5:

score: 0
Skipped

Dependency #4:

0%