Submission #291699

#TimeUsernameProblemLanguageResultExecution timeMemory
291699SamAndSeats (IOI18_seats)C++17
5 / 100
4065 ms90372 KiB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
typedef long long ll;
const int N = 1000006;

int n, m;
int x[N], y[N];

struct ban
{
    int minx, maxx;
    int miny, maxy;
    ban()
    {
        minx = miny = N;
        maxx = maxy = -1;
    }
    ban(int x, int y)
    {
        minx = maxx = x;
        miny = maxy = y;
    }
};

ban mer(const ban& l, const ban& r)
{
    ban res;
    res.minx = min(l.minx, r.minx);
    res.maxx = max(l.maxx, r.maxx);
    res.miny = min(l.miny, r.miny);
    res.maxy = max(l.maxy, r.maxy);
    return res;
}

ban t[N * 4];
void ubd(int tl, int tr, int x, pair<int, int> y, int pos)
{
    if (tl == tr)
    {
        t[pos] = ban(y.fi, y.se);
        return;
    }
    int m = (tl + tr) / 2;
    if (x <= m)
        ubd(tl, m, x, y, pos * 2);
    else
        ubd(m + 1, tr, x, y, pos * 2 + 1);
    t[pos] = mer(t[pos * 2], t[pos * 2 + 1]);
}

ban qry(int tl, int tr, int l, int r, int pos)
{
    if (l > r)
        return ban();
    if (tl == l && tr == r)
    {
        return t[pos];
    }
    int m = (tl + tr) / 2;
    return mer(qry(tl, m, l, min(m, r), pos * 2),
               qry(m + 1, tr, max(m + 1, l), r, pos * 2 + 1));
}

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C)
{
    n = H;
    m = W;
    for (int i = 0; i < n * m; ++i)
    {
        x[i] = R[i];
        y[i] = C[i];
    }
    for (int i = 0; i < n * m; ++i)
        ubd(0, n * m - 1, i, m_p(x[i], y[i]), 1);
}

int swap_seats(int a, int b)
{
    swap(x[a], x[b]);
    swap(y[a], y[b]);
    ubd(0, n * m - 1, a, m_p(x[a], y[a]), 1);
    ubd(0, n * m - 1, b, m_p(x[b], y[b]), 1);
    int ans = 0;
    for (int i = 0; i < n * m; ++i)
    {
        ban u = qry(0, n * m - 1, 0, i, 1);
        if ((u.maxx - u.minx + 1) * (u.maxy - u.miny + 1) == i + 1)
            ++ans;
    }
    return ans;
}
#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...