답안 #972151

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
972151 2024-04-30T07:37:02 Z RaresFelix The Potion of Great Power (CEOI20_potion) C++17
0 / 100
353 ms 262144 KB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,fma")
 
 
using namespace std;
 
using ii = pair<int, int>;
using vi = vector<int>;
 
namespace AINTpers {
    vector<short> Cnt;
    vi L, R;
    vector<bool> Calc;
    vector<vi> Idk;
 
    int nod_nou() {
        Cnt.push_back(0);
        L.push_back(-1);
        R.push_back(-1);
        Calc.push_back(false);
        Idk.push_back({});
        return int(Cnt.size()) - 1;
    }
 
    int join(int u, int v) {
        int re = L.size();
        int c = 0;
        if(u != -1) c += Cnt[u];
        if(v != -1) c += Cnt[v];
        Cnt.push_back(c);
        L.push_back(u);
        R.push_back(v);
        Calc.push_back(false);
        Idk.push_back({});
        return re;
    }
 
    int enable(int u, int p, int st, int dr) {
        if(p < st || dr < p) return u;
        if(st == dr) {
            int v = L.size();
            Cnt.push_back(1);
            L.push_back(-1); R.push_back(-1);
            Calc.push_back(false);
            Idk.push_back({});
            return v;
        }
        int l = -1, r = -1;
        if(u != -1) l = L[u];
        if(u != -1) r = R[u];
        return join(enable(l, p, st, (st + dr) >> 1),
            enable(r, p, ((st + dr) >> 1) + 1, dr));
    }
 
    int disable(int u, int p, int st, int dr) {
        if(p < st || dr < p) return u;
        if(st == dr) {
            int v = L.size();
            Cnt.push_back(0);
            L.push_back(-1); R.push_back(-1);
            Calc.push_back(false);
            Idk.push_back({});
            return v;
        }
        int l = -1, r = -1;
        if(u != -1) l = L[u];
        if(u != -1) r = R[u];
        return join(disable(l, p, st, (st + dr) >> 1), 
            disable(r, p, ((st + dr) >> 1) + 1, dr));
    }
 
    int stare(int u, int p, int st, int dr) {
        if(u == -1 || !Cnt[u]) return 0;
        if(st == dr) return Cnt[u];
        int mij = (st + dr) / 2;
        if(p <= mij) {
            return stare(L[u], p, st, mij);
        }
        return stare(R[u], p, mij + 1, dr);
    }

    mt19937 rng(1);
    vi enumerate(int u, int st, int dr) {
        if(u == -1 || !Cnt[u]) return vi{};
        if(Calc[u]) return Idk[u];
        if(uniform_int_distribution<int>(0, 10)(rng) == 0) {
            Calc[u] = true;
            if(st == dr) {
                Idk[u] = {st};
            } else {
                vi A = enumerate(L[u], st, (st + dr) >> 1);
                vi B = enumerate(R[u], ((st + dr) >> 1) + 1, dr);
                for(auto it : B) A.push_back(it);
                Idk[u] = A;
            }
            return Idk[u];
        } else {
            vi A = enumerate(L[u], st, (st + dr) >> 1);
            vi B = enumerate(R[u], ((st + dr) >> 1) + 1, dr);
            for(auto it : B) A.push_back(it);
            return A;
        }
    }
}
 
struct SetPers {
    int n;
    vector<ii> Rad;
 
    SetPers(int N) : n(N) {
        Rad.emplace_back(0, AINTpers::nod_nou());
    }
 
    void update(int t, int p) {
        int r = Rad.back().second;
        int a = AINTpers::stare(r, p, 0, n - 1);
        if(!a) {
            Rad.push_back({t, AINTpers::enable(r, p, 0, n - 1)});
        } else {
            Rad.push_back({t, AINTpers::disable(r, p, 0, n - 1)});
        }
    }
 
    vi list(int t) {
        auto it = upper_bound(Rad.begin(), Rad.end(), ii{t, 1e9});
        --it;
        int r = it->second;
        vi Re = AINTpers::enumerate(r, 0, n - 1);
        return Re;
    }
};
 
int n;
int* H0;
vi Perm;
 
vector<SetPers> S;
 
void init(int N, int D, int H[]) {
    n = N;
    H0 = H;
    for(int i = 0; i < n; ++i)
        Perm.push_back(i);
    sort(Perm.begin(), Perm.end(), [&](auto a, auto b) {
        return H[a] < H[b];
    });
    for(int i = 0; i < n; ++i)
        S.push_back(SetPers(N));
}
 
void curseChanges(int U, int A[], int B[]) {
    for(int i = 1; i <= U; ++i) {
        int a = A[i - 1], b = B[i - 1];
        S[Perm[a]].update(i, Perm[b]);
        S[Perm[b]].update(i, Perm[a]);
    }
}
 
const int INF = 1e9;
 
int question(int x, int y, int v) {
    vi A = S[Perm[x]].list(v), B = S[Perm[y]].list(v);
    vi VA, VB;
    for(auto it : A)
        VA.push_back(H0[it]);
    for(auto it : B)
        VB.push_back(H0[it]);
    int p1 = 0, p2 = 0;
    int re = INF;
    while(p1 < VA.size() && p2 < VB.size()) {
        re = min(re, abs(VB[p2] - VA[p1]));
        if(VA[p1] < VB[p2]) ++p1;
        else ++p2;
    }
    return re;
}

Compilation message

potion.cpp: In function 'int question(int, int, int)':
potion.cpp:171:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  171 |     while(p1 < VA.size() && p2 < VB.size()) {
      |           ~~~^~~~~~~~~~~
potion.cpp:171:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  171 |     while(p1 < VA.size() && p2 < VB.size()) {
      |                             ~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1684 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 353 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 334 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 19 ms 21264 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -