Submission #809589

# Submission time Handle Problem Language Result Execution time Memory
809589 2023-08-06T02:25:36 Z becaido Seats (IOI18_seats) C++17
100 / 100
2182 ms 165212 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,popcnt,sse4,abm")
#include <bits/stdc++.h>
#include "seats.h"
using namespace std;

#define ll long long
#define Waimai ios::sync_with_stdio(false), cin.tie(0)
#define FOR(x,a,b) for (int x = a, I = b; x <= I; x++)
#define pb emplace_back
#define F first
#define S second

#define lpos pos*2
#define rpos pos*2+1

const int SIZE = 1e6 + 5;

int n, m;
int x[SIZE], y[SIZE];
vector<int> a[SIZE];
pair<int, int> d[SIZE];

pair<int, int> operator + (const pair<int, int> &l, const pair<int, int> &r) {
    return pair<int, int>(l.F + r.F, l.S + r.S);
}
pair<int, int>& operator += (pair<int, int> &l, const pair<int, int> &r) {
    return l = l + r;
}

struct Node {
    pair<int, int> mn, lazy;
    int cnt;
    Node() = default;
    Node operator + (const Node &r) const {
        Node re = Node();
        re.mn = min(mn, r.mn);
        re.cnt = (mn == re.mn ? cnt : 0) + (r.mn == re.mn ? r.cnt : 0);
        return re;
    }
} node[SIZE * 4];

void push(int pos, int l, int r) {
    node[pos].mn += node[pos].lazy;
    if (l < r) {
        node[lpos].lazy += node[pos].lazy;
        node[rpos].lazy += node[pos].lazy;
    }
    node[pos].lazy = {0, 0};
}
void pull(int pos, int l, int r) {
    int mid = (l + r) / 2;
    push(lpos, l, mid);
    push(rpos, mid + 1, r);
    node[pos] = node[lpos] + node[rpos];
}

void build(int pos, int l, int r) {
    if (l == r) {
        node[pos].mn = d[l];
        node[pos].cnt = 1;
        return;
    }
    int mid = (l + r) / 2;
    build(lpos, l, mid);
    build(rpos, mid + 1, r);
    node[pos] = node[lpos] + node[rpos];
}
void upd(int pos, int l, int r, int L, int R, pair<int, int> x) {
    if (l == L && r == R) {
        node[pos].lazy += x;
        return;
    }
    push(pos, L, R);
    int mid = (L + R) / 2;
    if (r <= mid) upd(lpos, l, r, L, mid, x);
    else if (l > mid) upd(rpos, l, r, mid + 1, R, x);
    else {
        upd(lpos, l, mid, L, mid, x);
        upd(rpos, mid + 1, r, mid + 1, R, x);
    }
    pull(pos, L, R);
}
void upd(int l, int r, pair<int, int> x) {
    if (l > r) return;
    upd(1, l, r, 0, n * m - 1, x);
}
int que() {
    push(1, 0, n * m - 1);
    if (node[1].mn == make_pair(4, 0)) return node[1].cnt;
    return 0;
}

void add(int i, int j, int delta, bool pre = 0) {
    vector<int> t;
    FOR (di, 0, 1) FOR (dj, 0, 1) {
        if (min(i + di, j + dj) < 0 || i + di >= n || j + dj >= m) t.pb(n * m);
        else t.pb(a[i + di][j + dj]);
    }
    sort(t.begin(), t.end());
    if (pre) {
        d[t[0]] += {delta, 0};
        d[t[1]] += {-delta, 0};
        d[t[2]] += {0, delta};
        d[t[3]] += {0, -delta};
        return;
    }
    upd(t[0], t[1] - 1, {delta, 0});
    upd(t[2], t[3] - 1, {0, delta});
}

void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
    n = H, m = W;
    FOR (i, 0, n - 1) a[i].resize(m);
    FOR (i, 0, n * m - 1) {
        tie(x[i], y[i]) = make_pair(R[i], C[i]);
        a[x[i]][y[i]] = i;
    }
    FOR (i, -1, n - 1) FOR (j, -1, m - 1) add(i, j, 1, 1);
    FOR (i, 1, n * m - 1) d[i] += d[i - 1];
    build(1, 0, n * m - 1);
}

int swap_seats(int l, int r) {
    FOR (dx, -1, 0) FOR (dy, -1, 0) {
        add(x[l] + dx, y[l] + dy, -1);
        add(x[r] + dx, y[r] + dy, -1);
    }
    swap(a[x[l]][y[l]], a[x[r]][y[r]]);
    swap(x[l], x[r]), swap(y[l], y[r]);
    FOR (dx, -1, 0) FOR (dy, -1, 0) {
        add(x[l] + dx, y[l] + dy, 1);
        add(x[r] + dx, y[r] + dy, 1);
    }
    return que();
}
# Verdict Execution time Memory Grader output
1 Correct 79 ms 102176 KB Output is correct
2 Correct 92 ms 102236 KB Output is correct
3 Correct 89 ms 102176 KB Output is correct
4 Correct 80 ms 102180 KB Output is correct
5 Correct 73 ms 102204 KB Output is correct
6 Correct 88 ms 102140 KB Output is correct
7 Correct 95 ms 102244 KB Output is correct
8 Correct 84 ms 102164 KB Output is correct
9 Correct 88 ms 102208 KB Output is correct
10 Correct 97 ms 102224 KB Output is correct
11 Correct 94 ms 102328 KB Output is correct
12 Correct 74 ms 102252 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 79 ms 102176 KB Output is correct
2 Correct 92 ms 102236 KB Output is correct
3 Correct 89 ms 102176 KB Output is correct
4 Correct 80 ms 102180 KB Output is correct
5 Correct 73 ms 102204 KB Output is correct
6 Correct 88 ms 102140 KB Output is correct
7 Correct 95 ms 102244 KB Output is correct
8 Correct 84 ms 102164 KB Output is correct
9 Correct 88 ms 102208 KB Output is correct
10 Correct 97 ms 102224 KB Output is correct
11 Correct 94 ms 102328 KB Output is correct
12 Correct 74 ms 102252 KB Output is correct
13 Correct 143 ms 102640 KB Output is correct
14 Correct 162 ms 102648 KB Output is correct
15 Correct 100 ms 102572 KB Output is correct
16 Correct 96 ms 102920 KB Output is correct
17 Correct 122 ms 102644 KB Output is correct
18 Correct 133 ms 102716 KB Output is correct
19 Correct 129 ms 102648 KB Output is correct
20 Correct 114 ms 102764 KB Output is correct
21 Correct 99 ms 102680 KB Output is correct
22 Correct 95 ms 102940 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 610 ms 137868 KB Output is correct
2 Correct 475 ms 138276 KB Output is correct
3 Correct 436 ms 138528 KB Output is correct
4 Correct 441 ms 138264 KB Output is correct
5 Correct 446 ms 138200 KB Output is correct
6 Correct 460 ms 138340 KB Output is correct
7 Correct 459 ms 138280 KB Output is correct
8 Correct 451 ms 138256 KB Output is correct
9 Correct 433 ms 138344 KB Output is correct
10 Correct 430 ms 138188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 129 ms 102628 KB Output is correct
2 Correct 163 ms 105556 KB Output is correct
3 Correct 425 ms 137832 KB Output is correct
4 Correct 622 ms 138252 KB Output is correct
5 Correct 493 ms 138108 KB Output is correct
6 Correct 666 ms 165212 KB Output is correct
7 Correct 453 ms 137812 KB Output is correct
8 Correct 464 ms 137860 KB Output is correct
9 Correct 445 ms 138004 KB Output is correct
10 Correct 453 ms 138592 KB Output is correct
11 Correct 473 ms 149556 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 178 ms 103284 KB Output is correct
2 Correct 223 ms 103304 KB Output is correct
3 Correct 320 ms 103292 KB Output is correct
4 Correct 377 ms 103332 KB Output is correct
5 Correct 532 ms 103796 KB Output is correct
6 Correct 1046 ms 137764 KB Output is correct
7 Correct 1072 ms 138216 KB Output is correct
8 Correct 1043 ms 138276 KB Output is correct
9 Correct 1347 ms 137848 KB Output is correct
10 Correct 963 ms 137864 KB Output is correct
11 Correct 982 ms 137792 KB Output is correct
12 Correct 961 ms 137796 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 79 ms 102176 KB Output is correct
2 Correct 92 ms 102236 KB Output is correct
3 Correct 89 ms 102176 KB Output is correct
4 Correct 80 ms 102180 KB Output is correct
5 Correct 73 ms 102204 KB Output is correct
6 Correct 88 ms 102140 KB Output is correct
7 Correct 95 ms 102244 KB Output is correct
8 Correct 84 ms 102164 KB Output is correct
9 Correct 88 ms 102208 KB Output is correct
10 Correct 97 ms 102224 KB Output is correct
11 Correct 94 ms 102328 KB Output is correct
12 Correct 74 ms 102252 KB Output is correct
13 Correct 143 ms 102640 KB Output is correct
14 Correct 162 ms 102648 KB Output is correct
15 Correct 100 ms 102572 KB Output is correct
16 Correct 96 ms 102920 KB Output is correct
17 Correct 122 ms 102644 KB Output is correct
18 Correct 133 ms 102716 KB Output is correct
19 Correct 129 ms 102648 KB Output is correct
20 Correct 114 ms 102764 KB Output is correct
21 Correct 99 ms 102680 KB Output is correct
22 Correct 95 ms 102940 KB Output is correct
23 Correct 610 ms 137868 KB Output is correct
24 Correct 475 ms 138276 KB Output is correct
25 Correct 436 ms 138528 KB Output is correct
26 Correct 441 ms 138264 KB Output is correct
27 Correct 446 ms 138200 KB Output is correct
28 Correct 460 ms 138340 KB Output is correct
29 Correct 459 ms 138280 KB Output is correct
30 Correct 451 ms 138256 KB Output is correct
31 Correct 433 ms 138344 KB Output is correct
32 Correct 430 ms 138188 KB Output is correct
33 Correct 129 ms 102628 KB Output is correct
34 Correct 163 ms 105556 KB Output is correct
35 Correct 425 ms 137832 KB Output is correct
36 Correct 622 ms 138252 KB Output is correct
37 Correct 493 ms 138108 KB Output is correct
38 Correct 666 ms 165212 KB Output is correct
39 Correct 453 ms 137812 KB Output is correct
40 Correct 464 ms 137860 KB Output is correct
41 Correct 445 ms 138004 KB Output is correct
42 Correct 453 ms 138592 KB Output is correct
43 Correct 473 ms 149556 KB Output is correct
44 Correct 178 ms 103284 KB Output is correct
45 Correct 223 ms 103304 KB Output is correct
46 Correct 320 ms 103292 KB Output is correct
47 Correct 377 ms 103332 KB Output is correct
48 Correct 532 ms 103796 KB Output is correct
49 Correct 1046 ms 137764 KB Output is correct
50 Correct 1072 ms 138216 KB Output is correct
51 Correct 1043 ms 138276 KB Output is correct
52 Correct 1347 ms 137848 KB Output is correct
53 Correct 963 ms 137864 KB Output is correct
54 Correct 982 ms 137792 KB Output is correct
55 Correct 961 ms 137796 KB Output is correct
56 Correct 272 ms 103376 KB Output is correct
57 Correct 501 ms 103384 KB Output is correct
58 Correct 770 ms 103652 KB Output is correct
59 Correct 1498 ms 137800 KB Output is correct
60 Correct 2182 ms 137816 KB Output is correct
61 Correct 1342 ms 137756 KB Output is correct
62 Correct 1164 ms 137744 KB Output is correct
63 Correct 2039 ms 137676 KB Output is correct
64 Correct 1550 ms 137696 KB Output is correct
65 Correct 1389 ms 137680 KB Output is correct
66 Correct 1619 ms 137736 KB Output is correct
67 Correct 1562 ms 138464 KB Output is correct
68 Correct 1229 ms 144080 KB Output is correct
69 Correct 1719 ms 149424 KB Output is correct