Submission #78799

# Submission time Handle Problem Language Result Execution time Memory
78799 2018-10-09T01:28:09 Z wleung_bvg Seats (IOI18_seats) C++14
100 / 100
3217 ms 63964 KB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define f first
#define s second
#define all(a) (a).begin(),(a).end()
#define For(i,a,b) for(auto i=(a);i<(b);i++)
#define FOR(i,b) For(i,0,b)
#define Rev(i,a,b) for(auto i=(a);i>(b);i--)
#define REV(i,a) Rev(i,a,-1)
#define FORE(i,a) for(auto&&i:a)
#define sz(a) (int((a).size()))
#define MIN(a,b) ((a)=min((a),(b)))
#define MAX(a,b) ((a)=max((a),(b)))
using ll=long long;using ld=long double;using uint=unsigned int;using ull=unsigned long long;
using pii=pair<int,int>;using pll=pair<ll,ll>;using pill=pair<int,ll>;using plli=pair<ll,int>;using pdd=pair<double,double>;using pld=pair<ld,ld>;
constexpr const char nl='\n',sp=' ';constexpr const int INT_INF=0x3f3f3f3f;constexpr const ll LL_INF=0x3f3f3f3f3f3f3f3f;
constexpr const double D_INF=numeric_limits<double>::infinity();constexpr const ld LD_INF=numeric_limits<ld>::infinity();constexpr const double EPS=1e-9;

const int MAXHW = 1e6 + 5;

int H, W, N, M, VAL[MAXHW], L[MAXHW], R[MAXHW], C[MAXHW];
pii T[MAXHW * 2];

pii merge(const pii &l, const pii &r) {
    if (l.f < r.f) return l;
    else if (l.f > r.f) return r;
    else return mp(l.f, l.s + r.s);
}

void apply(int i, int v) {
    T[i].f += v;
    if (i < N) L[i] += v;
}

void pushup(int i) {
    while (i > 1) {
        i >>= 1;
        T[i] = merge(T[i << 1], T[i << 1 | 1]);
        T[i].f += L[i];
    }
}

void propagate(int i) {
    for (int h = M; h > 0; h--) {
        int ii = i >> h;
        if (L[ii] != 0) {
            apply(ii << 1, L[ii]);
            apply(ii << 1 | 1, L[ii]);
            L[ii] = 0;
        }
    }
}

void update(int l, int r, int v) {
    int l0 = l += N, r0 = r += N;
    propagate(l);
    propagate(r);
    for (; l <= r; l >>= 1, r >>= 1) {
        if (l & 1) apply(l++, v);
        if (!(r & 1)) apply(r--, v);
    }
    pushup(l0);
    pushup(r0);
}

int getVal(int r, int c) {
    return r < 0 || r >= H || c < 0 || c >= W ? N : VAL[r * W + c];
}

void updateSingle(int r, int c, int v) {
    vector<int> A;
    FOR(i, 2) FOR(j, 2) A.pb(getVal(r - i, c - j));
    sort(all(A));
    if (A[0] < A[1]) update(A[0], A[1] - 1, v);
    if (A[2] < A[3]) update(A[2], A[3] - 1, v);
}

void updateSquare(int r, int c, int v) {
    FOR(i, 2) FOR(j, 2) updateSingle(r + i, c + j, -1);
    VAL[r * W + c] = v;
    FOR(i, 2) FOR(j, 2) updateSingle(r + i, c + j, 1);
}

void give_initial_chart(int h, int w, vector<int> r, vector<int> c) {
    N = (H = h) * (W = w);
    M = 0;
    for (int i = 1; i <= N; M++) i <<= 1;
    FOR(i, N) {
        T[N + i] = mp(0, 1);
        L[i] = 0;
    }
    Rev(i, N - 1, 0) T[i] = merge(T[i << 1], T[i << 1 | 1]);
    FOR(i, N) VAL[(R[i] = r[i]) * W + (C[i] = c[i])] = i;
    FOR(i, H + 1) FOR(j, W + 1) updateSingle(i, j, 1);
    assert(T[1].f == 4);
}

int swap_seats(int a, int b) {
    updateSquare(R[a], C[a], b);
    updateSquare(R[b], C[b], a);
    swap(R[a], R[b]);
    swap(C[a], C[b]);
    assert(T[1].f == 4);
    return T[1].s;
}
# Verdict Execution time Memory Grader output
1 Correct 30 ms 504 KB Output is correct
2 Correct 37 ms 604 KB Output is correct
3 Correct 46 ms 736 KB Output is correct
4 Correct 32 ms 888 KB Output is correct
5 Correct 31 ms 888 KB Output is correct
6 Correct 40 ms 888 KB Output is correct
7 Correct 44 ms 888 KB Output is correct
8 Correct 46 ms 888 KB Output is correct
9 Correct 43 ms 888 KB Output is correct
10 Correct 46 ms 888 KB Output is correct
11 Correct 46 ms 892 KB Output is correct
12 Correct 33 ms 892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 30 ms 504 KB Output is correct
2 Correct 37 ms 604 KB Output is correct
3 Correct 46 ms 736 KB Output is correct
4 Correct 32 ms 888 KB Output is correct
5 Correct 31 ms 888 KB Output is correct
6 Correct 40 ms 888 KB Output is correct
7 Correct 44 ms 888 KB Output is correct
8 Correct 46 ms 888 KB Output is correct
9 Correct 43 ms 888 KB Output is correct
10 Correct 46 ms 888 KB Output is correct
11 Correct 46 ms 892 KB Output is correct
12 Correct 33 ms 892 KB Output is correct
13 Correct 87 ms 1416 KB Output is correct
14 Correct 86 ms 1416 KB Output is correct
15 Correct 58 ms 1416 KB Output is correct
16 Correct 52 ms 1416 KB Output is correct
17 Correct 66 ms 1460 KB Output is correct
18 Correct 69 ms 1460 KB Output is correct
19 Correct 74 ms 1460 KB Output is correct
20 Correct 83 ms 1460 KB Output is correct
21 Correct 51 ms 1460 KB Output is correct
22 Correct 59 ms 1480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2074 ms 51532 KB Output is correct
2 Correct 1351 ms 51752 KB Output is correct
3 Correct 1306 ms 51752 KB Output is correct
4 Correct 1192 ms 51752 KB Output is correct
5 Correct 1180 ms 51752 KB Output is correct
6 Correct 1378 ms 51752 KB Output is correct
7 Correct 1252 ms 51752 KB Output is correct
8 Correct 1195 ms 51752 KB Output is correct
9 Correct 1303 ms 51752 KB Output is correct
10 Correct 1318 ms 51752 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 75 ms 51752 KB Output is correct
2 Correct 181 ms 51752 KB Output is correct
3 Correct 1162 ms 51752 KB Output is correct
4 Correct 2011 ms 51752 KB Output is correct
5 Correct 1325 ms 51752 KB Output is correct
6 Correct 1923 ms 51752 KB Output is correct
7 Correct 1173 ms 51752 KB Output is correct
8 Correct 1286 ms 51752 KB Output is correct
9 Correct 1290 ms 51752 KB Output is correct
10 Correct 1317 ms 52308 KB Output is correct
11 Correct 1249 ms 54804 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 197 ms 54804 KB Output is correct
2 Correct 243 ms 54804 KB Output is correct
3 Correct 292 ms 54804 KB Output is correct
4 Correct 342 ms 54804 KB Output is correct
5 Correct 417 ms 54804 KB Output is correct
6 Correct 1823 ms 55172 KB Output is correct
7 Correct 1896 ms 55172 KB Output is correct
8 Correct 1847 ms 55172 KB Output is correct
9 Correct 2694 ms 55172 KB Output is correct
10 Correct 1826 ms 57228 KB Output is correct
11 Correct 1831 ms 57228 KB Output is correct
12 Correct 1887 ms 57268 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 30 ms 504 KB Output is correct
2 Correct 37 ms 604 KB Output is correct
3 Correct 46 ms 736 KB Output is correct
4 Correct 32 ms 888 KB Output is correct
5 Correct 31 ms 888 KB Output is correct
6 Correct 40 ms 888 KB Output is correct
7 Correct 44 ms 888 KB Output is correct
8 Correct 46 ms 888 KB Output is correct
9 Correct 43 ms 888 KB Output is correct
10 Correct 46 ms 888 KB Output is correct
11 Correct 46 ms 892 KB Output is correct
12 Correct 33 ms 892 KB Output is correct
13 Correct 87 ms 1416 KB Output is correct
14 Correct 86 ms 1416 KB Output is correct
15 Correct 58 ms 1416 KB Output is correct
16 Correct 52 ms 1416 KB Output is correct
17 Correct 66 ms 1460 KB Output is correct
18 Correct 69 ms 1460 KB Output is correct
19 Correct 74 ms 1460 KB Output is correct
20 Correct 83 ms 1460 KB Output is correct
21 Correct 51 ms 1460 KB Output is correct
22 Correct 59 ms 1480 KB Output is correct
23 Correct 2074 ms 51532 KB Output is correct
24 Correct 1351 ms 51752 KB Output is correct
25 Correct 1306 ms 51752 KB Output is correct
26 Correct 1192 ms 51752 KB Output is correct
27 Correct 1180 ms 51752 KB Output is correct
28 Correct 1378 ms 51752 KB Output is correct
29 Correct 1252 ms 51752 KB Output is correct
30 Correct 1195 ms 51752 KB Output is correct
31 Correct 1303 ms 51752 KB Output is correct
32 Correct 1318 ms 51752 KB Output is correct
33 Correct 75 ms 51752 KB Output is correct
34 Correct 181 ms 51752 KB Output is correct
35 Correct 1162 ms 51752 KB Output is correct
36 Correct 2011 ms 51752 KB Output is correct
37 Correct 1325 ms 51752 KB Output is correct
38 Correct 1923 ms 51752 KB Output is correct
39 Correct 1173 ms 51752 KB Output is correct
40 Correct 1286 ms 51752 KB Output is correct
41 Correct 1290 ms 51752 KB Output is correct
42 Correct 1317 ms 52308 KB Output is correct
43 Correct 1249 ms 54804 KB Output is correct
44 Correct 197 ms 54804 KB Output is correct
45 Correct 243 ms 54804 KB Output is correct
46 Correct 292 ms 54804 KB Output is correct
47 Correct 342 ms 54804 KB Output is correct
48 Correct 417 ms 54804 KB Output is correct
49 Correct 1823 ms 55172 KB Output is correct
50 Correct 1896 ms 55172 KB Output is correct
51 Correct 1847 ms 55172 KB Output is correct
52 Correct 2694 ms 55172 KB Output is correct
53 Correct 1826 ms 57228 KB Output is correct
54 Correct 1831 ms 57228 KB Output is correct
55 Correct 1887 ms 57268 KB Output is correct
56 Correct 278 ms 57268 KB Output is correct
57 Correct 443 ms 57268 KB Output is correct
58 Correct 655 ms 57268 KB Output is correct
59 Correct 2194 ms 57268 KB Output is correct
60 Correct 3217 ms 57268 KB Output is correct
61 Correct 2066 ms 57272 KB Output is correct
62 Correct 1991 ms 57272 KB Output is correct
63 Correct 3015 ms 62140 KB Output is correct
64 Correct 2260 ms 62140 KB Output is correct
65 Correct 2064 ms 62140 KB Output is correct
66 Correct 2283 ms 62140 KB Output is correct
67 Correct 2239 ms 63964 KB Output is correct
68 Correct 1957 ms 63964 KB Output is correct
69 Correct 2833 ms 63964 KB Output is correct