Submission #763168

#TimeUsernameProblemLanguageResultExecution timeMemory
763168t6twotwoSeats (IOI18_seats)C++17
37 / 100
4069 ms88392 KiB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;
constexpr int inf = 6 << 22;
int N, M, ans, T;
vector<int> A, B, xmax, xmin, ymax, ymin;
int f(int k) {
    return (xmax[k] - xmin[k] + 1) * (ymax[k] - ymin[k] + 1) == k;
}
struct node {
    int xmin, xmax, ymin, ymax;
    node() {
        xmin = ymin = inf;
        xmax = ymax = -inf;
    }
    node(int a, int b, int c, int d) {
        xmin = a;
        xmax = b;
        ymin = c;
        ymax = d;
    }
};
node operator+(node a, node b) {
    node c;
    c.xmin = min(a.xmin, b.xmin);
    c.xmax = max(a.xmax, b.xmax);
    c.ymin = min(a.ymin, b.ymin);
    c.ymax = max(a.ymax, b.ymax);
    return c;
}
vector<node> st;
void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
    N = H, M = W;
    A = R, B = C;
    xmax.resize(N * M + 1, -1);
    xmin.resize(N * M + 1, N);
    ymax.resize(N * M + 1, -1);
    ymin.resize(N * M + 1, M);
    for (int i = 0; i < N * M; i++) {
        xmax[i + 1] = max(xmax[i], A[i]);
        xmin[i + 1] = min(xmin[i], A[i]);
        ymax[i + 1] = max(ymax[i], B[i]);
        ymin[i + 1] = min(ymin[i], B[i]);
        ans += f(i + 1);
    }
    T = 2 << __lg(N * M);
    st.resize(T * 2 - 1);
    for (int i = 0; i < N * M; i++) {
        st[T - 1 + i] = {A[i], A[i], B[i], B[i]};
    }
    for (int i = T - 2; i >= 0; i--) {
        st[i] = st[i * 2 + 1] + st[i * 2 + 2];
    }
}
void modify(int p, int l, int r, int x, node v) {
    if (r - l == 1) {
        st[p] = v;
        return;
    }
    int m = (l + r + 1) / 2;
    if (x < m) {
        modify(p * 2 + 1, l, m, x, v);
    } else {
        modify(p * 2 + 2, m, r, x, v);
    }
    st[p] = st[p * 2 + 1] + st[p * 2 + 2];
}
int find(int p, int l, int r, node v) {
    if (r - l == 1) {
        return l;
    }
    int m = (l + r + 1) / 2;
    node u = st[p * 2 + 1];
    if (u.xmin < v.xmin || u.xmax > v.xmax || u.ymin < v.ymin || u.ymax > v.ymax) {
        return find(p * 2 + 1, l, m, v);
    } else {
        return find(p * 2 + 2, m, r, v);
    }
}
int swap_seats(int a, int b) {
    swap(A[a], A[b]);
    swap(B[a], B[b]);
    if (N <= 1000 && M <= 1000) {
        int ans = 1;
        modify(0, 0, T, a, {A[a], A[a], B[a], B[a]});
        modify(0, 0, T, b, {A[b], A[b], B[b], B[b]});
        int s = 0, L = B[0], R = B[0], U = A[0], D = A[0];
        while (L != 0 || R != M - 1 || U != 0 || D != N - 1) {
            int x = find(0, 0, T, {U, D, L, R});
            if ((D - U + 1) * (R - L + 1) == x) {
                ans++;
            }
            U = min(U, A[x]);
            D = max(D, A[x]);
            L = min(L, B[x]);
            R = max(R, B[x]);
            s = x;
        }
        return ans;
    }
    for (int i = min(a, b); i <= max(a, b); i++) {
        ans -= f(i + 1);
        xmax[i + 1] = max(xmax[i], A[i]);
        xmin[i + 1] = min(xmin[i], A[i]);
        ymax[i + 1] = max(ymax[i], B[i]);
        ymin[i + 1] = min(ymin[i], B[i]);
        ans += f(i + 1);
    }
    return ans;
}

Compilation message (stderr)

seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:87:13: warning: variable 's' set but not used [-Wunused-but-set-variable]
   87 |         int s = 0, L = B[0], R = B[0], U = A[0], D = A[0];
      |             ^
#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...