제출 #1195582

#제출 시각아이디문제언어결과실행 시간메모리
1195582vjudge2JOI tour (JOI24_joitour)C++20
16 / 100
230 ms43608 KiB
#include "joitour.h"
#include <bits/stdc++.h>
using namespace std;

using i32 = int32_t;
#define int long long
const int N = 2e5 + 5;
int n, f[N];

struct Node {
    int a0, a1, a2, a01, a12, a10, a21, a012, a210;
} dummy;

Node merge(Node lhs, Node rhs) {
    Node res;
    res.a0 = lhs.a0 + rhs.a0;
    res.a1 = lhs.a1 + rhs.a1;
    res.a2 = lhs.a2 + rhs.a2;
    res.a01 = lhs.a0 * rhs.a1 + lhs.a01 + rhs.a01;
    res.a12 = lhs.a1 * rhs.a2 + lhs.a12 + rhs.a12;
    res.a10 = lhs.a1 * rhs.a0 + lhs.a10 + rhs.a10;
    res.a21 = lhs.a2 * rhs.a1 + lhs.a21 + rhs.a21;
    res.a012 = lhs.a0 * rhs.a12 + lhs.a01 * rhs.a2 + lhs.a012 + rhs.a012;
    res.a210 = lhs.a2 * rhs.a10 + lhs.a21 * rhs.a0 + lhs.a210 + rhs.a210;
    return res;
}

struct SegTree {
    int size = 1;
    vector<Node> seg;
    void init(int sz) {
        while (size < sz) size *= 2;
        seg.assign(2 * size + 10, dummy);
    }
    void update(int pos, int v, int l, int r, int id) {
        if (l == r) {
            seg[id] = dummy;
            if (v == 0) seg[id].a0++;
            else if (v == 1) seg[id].a1++;
            else seg[id].a2++;
            return;
        }
        int mid = (l + r) / 2;
        if (pos <= mid) update(pos, v, l, mid, id * 2);
        else update(pos, v, mid + 1, r, id * 2 + 1);
        seg[id] = merge(seg[id * 2], seg[id * 2 + 1]);
    }
    Node query(int ql, int qr, int l, int r, int id) {
        if (ql <= l && r <= qr) return seg[id];
        if (qr < l || r < ql) return dummy;
        int mid = (l + r) / 2;
        return merge(query(ql, qr, l, mid, id * 2), query(ql, qr, mid + 1, r, id * 2 + 1));
    }
} ST;

void init(i32 _N, std::vector<i32> F, std::vector<i32> U, std::vector<i32> V,
          i32 Q) {
    n = _N;
    ST.init(n+1);
    for (int i = 0; i < n; i++) {
        f[i] = F[i];
        ST.update(i+1, f[i], 1, n, 1);
    }
}

void change(i32 X, i32 Y) {
    X++;
    ST.update(X, Y, 1, n, 1);
}

int num_tours() {
    Node res = ST.query(1, n, 1, n, 1);
    return res.a012 + res.a210;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...