Submission #212482

#TimeUsernameProblemLanguageResultExecution timeMemory
212482PeppaPigConstellation 3 (JOI20_constellation3)C++14
100 / 100
589 ms46728 KiB
#include <bits/stdc++.h>

#define long long long
#define pii pair<long, long>
#define x first
#define y second

using namespace std;

#define var int p = 1, int l = 1, int r = n
#define mid ((l + r) >> 1)
#define lb p << 1, l, mid
#define rb p << 1 | 1, mid + 1, r

const int N = 1 << 18;

struct UnionFind {
    int par[N], l[N], r[N];

    UnionFind() {
        iota(par, par + N, 0);
        iota(l, r + N, 0);
        iota(r, r + N, 0);
    }

    int find(int x) { return par[x] = x == par[x] ? x : find(par[x]); }

    void unite(int a, int b) {
        a = find(a), b = find(b);
        if(a == b) return;
        par[a] = b, l[b] = min(l[b], l[a]), r[b] = max(r[b], r[a]);
    }
} dsu;

int n, k;
long t[N << 1], lz[N << 1];

void push(var) {
    if(lz[p] != 0) {
        t[p] += lz[p];
        if(l != r) lz[p << 1] += lz[p], lz[p << 1 | 1] += lz[p];
        lz[p] = 0;
    }
}

void update(int x, int y, long k, var) {
    push(p, l, r);
    if(x > r || l > y) return;
    if(x <= l && r <= y) {
        lz[p] += k, push(p, l, r);
        return;
    }
    update(x, y, k, lb), update(x, y, k, rb);
    t[p] = max(t[p << 1], t[p << 1 | 1]);
}

long query(int x, int y, var) {
    push(p, l, r);
    if(x > r || l > y) return 0;
    if(x <= l && r <= y) return t[p];
    return max(query(x, y, lb), query(x, y, rb));
}

int A[N];
vector<int> Y[N];
vector<pii> star_x[N], star_y[N];
bitset<N> chk;

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", A + i);
        Y[A[i] + 1].emplace_back(i);
    }
    scanf("%d", &k);

    long sum = 0;
    for(int i = 1, x, y, c; i <= k; i++) {
        scanf("%d %d %d", &x, &y, &c);
        star_x[x].emplace_back(y, c);
        sum += c;
    }
    for(int i = 1; i <= n; i++) {
        sort(star_x[i].begin(), star_x[i].end());
        int pre = 0;
        for(pii p : star_x[i]) if(p.y > pre) {
            star_y[p.x].emplace_back(i, p.y - pre);
            pre = p.y;
        }
    }

    for(int i = 1; i <= n + 1; i++) {
        for(int x : Y[i]) {
            long val_l = 0, val_r = 0;
            if(x > 1 && chk[x - 1]) {
                int par_l = dsu.find(x - 1);
                val_l = query(dsu.l[par_l], dsu.r[par_l]);
            }
            if(x < n && chk[x + 1]) {
                int par_r = dsu.find(x + 1);
                val_r = query(dsu.l[par_r], dsu.r[par_r]);
            }
            if(x > 1 && chk[x - 1]) {
                int par_l = dsu.find(x - 1);
                update(dsu.l[par_l], dsu.r[par_l], val_r);
            }
            if(x < n && chk[x + 1]) {
                int par_r = dsu.find(x + 1);
                update(dsu.l[par_r], dsu.r[par_r], val_l);
            }
            update(x, x, val_l + val_r);
            if(x > 1 && chk[x - 1]) dsu.unite(x - 1, x);
            if(x < n && chk[x + 1]) dsu.unite(x, x + 1);
            chk[x] = 1;
        }
        for(pii p : star_y[i]) update(p.x, p.x, p.y);
    }
    
    printf("%lld\n", sum - t[1]);

    return 0;
}

Compilation message (stderr)

constellation3.cpp: In function 'int main()':
constellation3.cpp:70:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
constellation3.cpp:72:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", A + i);
         ~~~~~^~~~~~~~~~~~~
constellation3.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &k);
     ~~~~~^~~~~~~~~~
constellation3.cpp:79:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d", &x, &y, &c);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...