답안 #660723

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
660723 2022-11-22T21:55:37 Z Lobo The Potion of Great Power (CEOI20_potion) C++17
21 / 100
746 ms 262144 KB
#include<bits/stdc++.h>
using namespace std;
const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
// #define int long long
#define ll long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

const int maxn = 2e5+10;

int n, a[maxn], idord[maxn];
vector<pair<int,int>> ord;

vector<pair<int,int>> g[maxn];
vector<pair<int,vector<int>>> frds[maxn];
const int BC = 1;

void init(int N, int D, int H[]) {
    n = N;
    for(int i = 0; i < n; i++) {
        ord.pb(mp(H[i],i));
    }
    sort(all(ord));
    for(int i = 0; i < n; i++) {
        idord[ord[i].sc] = i;
        a[i] = ord[i].fr;
    }
}

void curseChanges(int U, int A[], int B[]) {
    for(int i = 0; i < U; i++) {
        int u = idord[A[i]];
        int v = idord[B[i]];

        g[u].pb(mp(i+1,v));
        g[v].pb(mp(i+1,u));
    }

    for(int i = 0; i < n; i++) {
        set<int> st;
        int cnt = 0;
        frds[i].pb(mp(0,vector<int>{}));
        for(auto X : g[i]) {
            int j = X.sc;
            int id = X.fr;
            if(st.count(j)) st.erase(j);
            else st.insert(j);

            if(++cnt == BC || g[i].back().fr == id) {
                frds[i].pb(mp(id,vector<int>{}));
                for(auto x : st) {
                    frds[i].back().sc.pb(x);
                }
                cnt = 0;
            }
        }
        frds[i].pb(mp(U+1,vector<int>{}));
        g[i].pb(mp(U+1,-1));

        // cout << i << "  " << a[i] << endl;
        // for(auto x : frds[i]) {
        //     cout << " " << x.fr << endl;
        // }
    }
}

int question(int x, int y, int v) {
    x = idord[x];
    y = idord[y];

    vector<int> vcx, vcx0, vcx1;
    auto itfrx = prev(lower_bound(all(frds[x]),mp(v+1,vector<int>{})));
    vcx0 = itfrx->sc;
    // vcx = vcx0;
    set<int> stx;
    for(auto it = lower_bound(all(g[x]),mp(itfrx->fr+1,0)); it->fr <= v; it++) {
        int i = it->sc;
        if(stx.count(i)) stx.erase(i);
        else stx.insert(i);
    }
    for(auto i : stx) vcx1.pb(i); 
    int i0 = 0;
    int i1 = 0;
    while(i0 != vcx0.size() && i1 != vcx1.size()) {
        if(vcx0[i0] < vcx1[i1]) {
            vcx.pb(vcx0[i0]);
            i0++;
        }
        else if(vcx0[i0] > vcx1[i1]) {
            vcx.pb(vcx1[i1]);
            i1++;
        }
        else {
            i0++;
            i1++;
        }
    }
    while(i0 != vcx0.size()) {
        vcx.pb(vcx0[i0]);
        i0++;
    }
    while(i1 != vcx1.size()) {
        vcx.pb(vcx1[i1]);
        i1++;
    }

    // cout << x << " " << " x " << prev(lower_bound(all(frds[x]),mp(v+1,vector<int>{})))->fr << endl;
    vector<int> vcy, vcy0, vcy1;
    auto itfry = prev(lower_bound(all(frds[y]),mp(v+1,vector<int>{})));
    vcy0 = itfry->sc;
    vcy = vcy0;
    // set<int> sty;
    // for(auto it = lower_bound(all(g[y]),mp(itfry->fr+1,0)); it->fr <= v; it++) {
    //     int i = it->sc;
    //     if(sty.count(i)) sty.erase(i);
    //     else sty.insert(i);
    // }
    // for(auto i : sty) vcy1.pb(i); 
    // int j0 = 0;
    // int j1 = 0;
    // while(j0 != vcy0.size() && j1 != vcy1.size()) {
    //     if(vcy0[j0] < vcy1[j1]) {
    //         vcy.pb(vcy0[j0]);
    //         j0++;
    //     }
    //     else if(vcy0[j0] > vcy1[j1]) {
    //         vcy.pb(vcy1[j1]);
    //         j1++;
    //     }
    //     else {
    //         j0++;
    //         j1++;
    //     }
    // }
    // while(j0 != vcy0.size()) {
    //     vcy.pb(vcy0[j0]);
    //     j0++;
    // }
    // while(j1 != vcy1.size()) {
    //     vcy.pb(vcy1[j1]);
    //     j1++;
    // }
    // cout << " y " << prev(lower_bound(all(frds[y]),mp(v+1,vector<int>{})))->fr << endl;

    if(vcx.size() == 0) return 1000000000;
    if(vcy.size() == 0) return 1000000000;

    int i = 0;
    int j = 0;
    int ans = inf1;
    while(i != vcx.size() && j != vcy.size()) {
        ans = min(ans, abs(a[vcx[i]]-a[vcy[j]]));
        if(a[vcx[i]] < a[vcy[j]]) {
            //increase i
            i++;
        }
        else {
            j++;
        }
    }

    return ans;
}

Compilation message

potion.cpp: In function 'int question(int, int, int)':
potion.cpp:90:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |     while(i0 != vcx0.size() && i1 != vcx1.size()) {
      |           ~~~^~~~~~~~~~~~~~
potion.cpp:90:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |     while(i0 != vcx0.size() && i1 != vcx1.size()) {
      |                                ~~~^~~~~~~~~~~~~~
potion.cpp:104:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |     while(i0 != vcx0.size()) {
      |           ~~~^~~~~~~~~~~~~~
potion.cpp:108:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |     while(i1 != vcx1.size()) {
      |           ~~~^~~~~~~~~~~~~~
potion.cpp:157:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |     while(i != vcx.size() && j != vcy.size()) {
      |           ~~^~~~~~~~~~~~~
potion.cpp:157:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |     while(i != vcx.size() && j != vcy.size()) {
      |                              ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 9936 KB Output is correct
2 Correct 7 ms 10004 KB Output is correct
3 Incorrect 6 ms 9936 KB Incorrect
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 282 ms 60136 KB Output is correct
2 Correct 336 ms 60140 KB Output is correct
3 Incorrect 223 ms 67540 KB Incorrect
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 261 ms 60068 KB Output is correct
2 Runtime error 746 ms 262144 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 12752 KB Output is correct
2 Correct 64 ms 13392 KB Output is correct
3 Correct 78 ms 13396 KB Output is correct
4 Correct 180 ms 19924 KB Output is correct
5 Correct 161 ms 18512 KB Output is correct
6 Correct 71 ms 12496 KB Output is correct
7 Correct 158 ms 18476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 9680 KB Output is correct
2 Correct 9 ms 9936 KB Output is correct
3 Correct 7 ms 10004 KB Output is correct
4 Incorrect 6 ms 9936 KB Incorrect
5 Halted 0 ms 0 KB -