제출 #931767

#제출 시각아이디문제언어결과실행 시간메모리
931767sysiaThe Potion of Great Power (CEOI20_potion)C++17
100 / 100
2360 ms81152 KiB
#include <bits/stdc++.h>
using namespace std;
void __print(int x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << "'" << x << "'";}
void __print(const char *x) {cerr << '"' << x << '"';}
void __print(const string &x) {cerr << '"' << x << '"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef LOCAL
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif

typedef pair<int, int> T;
const int oo2 = 1e9;
int n, d;
vector<int>h;
vector<T>edges, life;

void init(int _n, int _d, int H[]){
    n = _n; d = _d;
    h.resize(n);
    for (int i = 0; i<n; i++) h[i] = H[i];
}

int sz = 1;
vector<vector<T>>tab;

void init(int s){
    while (sz < s) sz*=2;
    tab.resize(2*sz);
}

void update(int x, int lx, int rx, int i){
    if (lx > life[i].second || rx < life[i].first) return;
    if (lx >= life[i].first && rx <= life[i].second) {
        for (int rep = 0; rep < 2; rep++){
            tab[x].emplace_back(edges[i]);
            swap(edges[i].first, edges[i].second);
        }
        return;
    }
    int m = (lx+rx)/2;
    update(2*x, lx, m, i);
    update(2*x+1, m+1, rx, i);
}

void curseChanges(int u, int A[], int B[]){
    map<T, int>alive;
    for (int i = 0; i<u; i++){
        if (A[i] > B[i]) swap(A[i], B[i]);
        if (alive.find({A[i], B[i]}) == alive.end()){
            alive[{A[i], B[i]}] = i+1;
        } else {
            edges.emplace_back(A[i], B[i]);
            life.emplace_back(alive[{A[i], B[i]}], i);
            alive.erase({A[i], B[i]});
        }
    }
    for (auto [v, i]: alive){
        edges.emplace_back(v);
        life.emplace_back(i, u);
    }
    init(u+1);
    debug(edges);
    debug(life);
    for (int i = 0; i<(int)life.size(); i++){
        update(1, 0, sz-1, i);
    }
    for (int i = 1; i<2*sz; i++){
        sort(tab[i].begin(), tab[i].end());
    }
}


void find(int x, int lx, int rx, int pos, int v, vector<T>&curr){
    //z wierzcholka x
    int L = (int)(lower_bound(tab[x].begin(), tab[x].end(), T{v, 0}) - tab[x].begin());
    for (int rep = L; rep < (int)tab[x].size(); rep++){
        if (tab[x][rep].first != v) break;
        curr.emplace_back(h[tab[x][rep].second], v);
    }
    if (lx == rx) return;
    int m = (lx+rx)/2;
    if (pos <= m) find(2*x, lx, m, pos, v, curr);
    else find(2*x+1, m+1, rx, pos, v, curr);
};


int question(int x, int y, int v){
    vector<T>X;
    find(1, 0, sz-1, v, x, X);
    find(1, 0, sz-1, v, y, X);
    debug(X);
    sort(X.begin(), X.end());
    
    int ans = oo2;
    for (int i = 1; i<(int)X.size(); i++){
        if (X[i].second != X[i-1].second) {
            ans = min(ans, X[i].first-X[i-1].first);
        }
    }
    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...