답안 #972513

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
972513 2024-04-30T14:11:03 Z RaresFelix The Potion of Great Power (CEOI20_potion) C++17
38 / 100
3000 ms 31300 KB
#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;
const int MN = 100000;
int n;
int H0[MN];

vector<pair<int, int> > Op[MN];
vi SnapId[MN];
vi Mare[400000]; 
int pma = 0;

void init(int N, int D, int H[]) {
    n = N;
    for(int i = 0; i < n; ++i)
        H0[i] = H[i];
}

int rad = 50;

void curseChanges(int U, int A[], int B[]) {
    for(int i = 0; i < U; ++i) {
        Op[A[i]].push_back({i + 1, B[i]});
        Op[B[i]].push_back({i + 1, A[i]});
    }

    set<int> S;
    for(int i = 0; i < n; ++i) {
        S.clear();
        SnapId[i].push_back(pma);
        ++pma;
        for(int j = 0; j < Op[i].size(); ++j) {
            if(j % rad == 0 && j) {
                SnapId[i].push_back(pma);
                Mare[pma].reserve(S.size());
                for(auto it : S) Mare[pma].push_back(it);
                ++pma;
            }
            auto [t, v] = Op[i][j];
            if(S.count(v)) S.erase(v);
            else S.insert(v);
        }
    }
}
const int INF = 1e9;

set<int> get(int x, int v) {
    int st = 0, dr = int(Op[x].size()) - 1, mij;
    if(Op[x].empty() || Op[x][0].first > v) return set<int>();
    while(st < dr) {
        mij = (st + dr + 1) / 2;
        if(Op[x][mij].first > v) dr = mij - 1; // e ok asa?
        else st = mij;
    }
    set<int> S;
    for(auto it : Mare[SnapId[x][st / rad]])
        S.insert(it);
    for(int i = st / rad * rad; i <= st; ++i) {
        auto [t, v] = Op[x][i];
        if(S.count(v)) S.erase(v);
        else S.insert(v);
    }
    return S;
}

int question(int x, int y, int v) {
    auto VecX = get(x, v), VecY = get(y, v);
    vi VA, VB;
    for(auto it : VecX) VA.push_back(H0[it]);
    for(auto it : VecY) VB.push_back(H0[it]);
    sort(VA.begin(), VA.end());
    sort(VB.begin(), VB.end());
    int pa = 0, pb = 0;
    int re = INF;
    while(pa < VA.size() && pb < VB.size()) {
        re = min(re, abs(VA[pa] - VB[pb]));
        if(VA[pa] < VB[pb]) ++pa;
        else ++pb;
    }
    return re;
}

Compilation message

potion.cpp: In function 'void curseChanges(int, int*, int*)':
potion.cpp:34:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |         for(int j = 0; j < Op[i].size(); ++j) {
      |                        ~~^~~~~~~~~~~~~~
potion.cpp: In function 'int question(int, int, int)':
potion.cpp:77:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |     while(pa < VA.size() && pb < VB.size()) {
      |           ~~~^~~~~~~~~~~
potion.cpp:77:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |     while(pa < VA.size() && pb < VB.size()) {
      |                             ~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 14424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 14424 KB Output is correct
2 Correct 4 ms 14424 KB Output is correct
3 Correct 4 ms 14424 KB Output is correct
4 Correct 17 ms 18600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 172 ms 25500 KB Output is correct
2 Correct 165 ms 26204 KB Output is correct
3 Correct 323 ms 23976 KB Output is correct
4 Correct 2178 ms 24416 KB Output is correct
5 Correct 593 ms 22084 KB Output is correct
6 Execution timed out 3044 ms 30944 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 150 ms 25748 KB Output is correct
2 Correct 2761 ms 31300 KB Output is correct
3 Correct 1420 ms 28076 KB Output is correct
4 Correct 2831 ms 30716 KB Output is correct
5 Correct 346 ms 26016 KB Output is correct
6 Execution timed out 3025 ms 30596 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 45 ms 15348 KB Output is correct
2 Correct 169 ms 15192 KB Output is correct
3 Correct 305 ms 15468 KB Output is correct
4 Correct 1371 ms 15704 KB Output is correct
5 Correct 1402 ms 15424 KB Output is correct
6 Correct 164 ms 14684 KB Output is correct
7 Correct 1160 ms 15200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 14424 KB Output is correct
2 Correct 4 ms 14424 KB Output is correct
3 Correct 4 ms 14424 KB Output is correct
4 Correct 4 ms 14424 KB Output is correct
5 Correct 17 ms 18600 KB Output is correct
6 Correct 172 ms 25500 KB Output is correct
7 Correct 165 ms 26204 KB Output is correct
8 Correct 323 ms 23976 KB Output is correct
9 Correct 2178 ms 24416 KB Output is correct
10 Correct 593 ms 22084 KB Output is correct
11 Execution timed out 3044 ms 30944 KB Time limit exceeded
12 Halted 0 ms 0 KB -