QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#103783#5098. 第一代图灵机bashkort#0 287ms33076kbC++204.7kb2023-05-07 15:44:152024-05-26 02:50:59

Judging History

This is the latest submission verdict.

  • [2024-05-26 02:50:59]
  • Judged
  • Verdict: 0
  • Time: 287ms
  • Memory: 33076kb
  • [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:44:15]
  • 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] < mn) {
                x = x << 1;
            } else {
                x = x << 1 | 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;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 5ms
memory: 4144kb

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:

6757775
4243316
995668
3883864
3852532
839886
799332
3760893
6560417
6602222
4368163
3963224
4043984
5640952
304544
2024983
823142
310042
277635
3329623
6770353
4615419
6541567
39374
1695239
6318699
437547
3506869
3257847
1157887
1292061
2376254
7699122
7121536
6032182
3793285
9801876
2872902
750734...

result:

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

Subtask #2:

score: 0
Wrong Answer

Test #3:

score: 0
Wrong Answer
time: 287ms
memory: 30004kb

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:

14520254940
3010209214
3092101237
4121673130
10593308866
14836410249
14042523465
10454328173
2829467170
16088138330
156846664
691884844
13168003042
11618785689
15869628828
9622247828
4998552257
683067340
7604179307
13314628628
12595954289
5290547225
4767632013
3799281876
2602008002
3586800479
136897...

result:

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

Subtask #3:

score: 0
Wrong Answer

Test #5:

score: 0
Wrong Answer
time: 176ms
memory: 33076kb

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:

6621858508
13369763706
931223557
2620475833
750333254
9534954289
3005023565
9839704978
13389325043
2836756946
125441385
547086620
3319086817
13401822199
12306023090
3918645481
4220592768
4196673580
17911564462
4642753825
12144192684
5386259737
3380344537
1694960013
11951325862
2557945957
14743220752...

result:

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

Subtask #4:

score: 0
Skipped

Dependency #1:

0%

Subtask #5:

score: 0
Skipped

Dependency #4:

0%