Submission #447729

#TimeUsernameProblemLanguageResultExecution timeMemory
447729MilosMilutinovicSeats (IOI18_seats)C++14
5 / 100
4065 ms71368 KiB
#include <bits/stdc++.h>
using namespace std;

#define pi pair<int, int>
#define X first
#define Y second

int h, w;
int r[1000005];
int c[1000005];

struct ST{
    pair<pi, pi> st[4000005];
    pair<pi, pi> comb(pair<pi, pi> x, pair<pi, pi> y) {
        pair<pi, pi> ret;
        ret.X.X = max(x.X.X, y.X.X);
        ret.X.Y = max(x.X.Y, y.X.Y);
        ret.Y.X = min(x.Y.X, y.Y.X);
        ret.Y.Y = min(x.Y.Y, y.Y.Y);
        return ret;
    }
    void Set(int node, int l, int r, int x, pi val) {
        if (l == r) {
            st[node].X = st[node].Y = val;
            return;
        }
        int mid = l + r >> 1;
        if (x <= mid) Set(node * 2, l, mid, x, val);
        else Set(node * 2 + 1, mid + 1, r, x, val);
        st[node] = comb(st[node * 2], st[node * 2 + 1]);
    }
    pair<pi, pi> Get(int node, int l, int r, int ql, int qr) {
        if (l > r || l > qr || r < ql) return {{0, 0}, {1e9, 1e9}};
        if (ql <= l && r <= qr) return st[node];
        int mid = l + r >> 1;
        return comb(Get(node * 2, l, mid, ql, qr), Get(node * 2 + 1, mid + 1, r, ql, qr));
    }
} ST;

void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
    h = H, w = W;
    for (int i = 0; i < h * w; i++) {
        r[i] = R[i];
        c[i] = C[i];
        ST.Set(1, 0, h * w - 1, i, {r[i], c[i]});
    }
}

int swap_seats(int a, int b) {
    swap(r[a], r[b]);
    swap(c[a], c[b]);
    ST.Set(1, 0, h * w - 1, a, {r[a], c[a]});
    ST.Set(1, 0, h * w - 1, b, {r[b], c[b]});
    int pos = 0, ans = 0;
    while (pos < h * w) {
        pair<pi, pi> rect = ST.Get(1, 0, h * w - 1, 0, pos);
        int P = (rect.X.X - rect.Y.X + 1) * (rect.X.Y - rect.Y.Y + 1);
        assert(P > pos);
        if (P == pos + 1) ans++, pos++;
        else pos = P - 1;
    }
    return ans;
}

Compilation message (stderr)

seats.cpp: In member function 'void ST::Set(int, int, int, int, std::pair<int, int>)':
seats.cpp:27:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |         int mid = l + r >> 1;
      |                   ~~^~~
seats.cpp: In member function 'std::pair<std::pair<int, int>, std::pair<int, int> > ST::Get(int, int, int, int, int)':
seats.cpp:35:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   35 |         int mid = l + r >> 1;
      |                   ~~^~~
#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...