답안 #624089

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
624089 2022-08-07T08:32:56 Z baluconisTima 자동 인형 (IOI18_doll) C++14
100 / 100
310 ms 34260 KB
#pragma GCC optimize("O3")
//#pragma GCC tagret("avx2")
#include<bits/stdc++.h>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define ll long long
#define pb push_back
#define ld long double
#define f first
#define s second

using namespace std;
using namespace __gnu_pbds;

typedef tree<ll, null_type,
        less<ll>, rb_tree_tag,
        tree_order_statistics_node_update> oset;

mt19937 gen(time(0));

const int MOD = 1e9 + 7;


void answer(vector<int> C, vector<int> X, vector<int> Y);


bool used[400007];
vector<int> X, Y;
ll build(ll gl) {
    if(gl == 0) {
        X.pb(0);
        Y.pb(0);
        return X.size() - 1;
    }
    ll v1 = X.size();
    X.pb(-1);
    Y.pb(-1);
    X[v1] = -build(gl - 1);
    Y[v1] = -build(gl - 1);
    return v1;
}


void go(ll v1, ll l, ll r, ll cr, ll root) {
    v1 = -v1;
    if(l + 1 == r) {
        if(l < cr) {
            X[v1] = root;
        }
        if(r < cr) {
            Y[v1] = root;
        }
        return;
    }
    ll mid = (l + r) / 2;
    go(X[v1], l, mid, cr, root);
    go(Y[v1], mid + 1, r, cr, root);
}

set<ll> recalc(ll v1, ll gl) {
    v1 = -v1;
    set<ll> st1, st2;
    if(gl == 0) {
        st1.insert(X[v1]);
        st2.insert(Y[v1]);
    } else {
        for(auto to: recalc(X[v1], gl - 1)) st1.insert(to);
        for(auto to: recalc(Y[v1], gl - 1)) st2.insert(to);
    }
    if(st1.size() == 1) {
        X[v1] = *st1.begin();
    }
    if(st2.size() == 1) {
        Y[v1] = *st2.begin();
    }
    for(auto to: st2) st1.insert(to);
    while(st1.size() > 2) st1.erase(*st1.rbegin());
    return st1;
}

bool col(ll v1, ll x, ll gl) {
    v1 = -v1;
    if(gl == 0) {
        used[v1] ^= 1;
        if(used[v1]) {
            if(X[v1] != 0) return 0;
            X[v1] = x;
        } else {
            if(Y[v1] != 0) return 0;
            Y[v1] = x;
        }
        return 1;
    }
    bool f = 0;
    if(!used[v1]) f = col(X[v1], x, gl - 1);
    else f = col(Y[v1], x, gl - 1);
    used[v1] ^= 1;
    return f;
}


void dob(ll v1, ll x, ll gl) {
    while(true) {
        if(col(v1, x, gl)) break;
    }
}



void create_circuit(int M, vector<int> B) {
//if(A.size() != 16) exit(-1);
    X.clear();
    Y.clear();
    vector<ll> A;
    for(int i = 1; i < B.size(); i++) {
        A.pb(B[i]);
    }
    A.pb(0);

    vector<int> sl(M + 1, 0);
    X.pb(0);
    Y.pb(0);
    ll now = 0;
    while((2 << now) < A.size()) {
        now++;
    }
    ll root = -build(now);
    for(auto &to: sl) to = root;
    ll d = (2 << now) - A.size();
    go(root, 0, (2 << now) - 1, d, root);

    for(auto to: A) {
        dob(root, to, now);
    }
    recalc(root, now);

    sl[0] = B[0];

set<ll> all;
for(auto to: sl) {
    if(to < 0) all.insert(-to);
}
for(int i = 1; i < X.size(); i++) {
    if(X[i] < 0) all.insert(-X[i]);
    if(Y[i] < 0) all.insert(-Y[i]);
}
map<ll,ll> mp;
ll e = -1;
for(auto to: all) {
    mp[to] = e;
    e--;
}

vector<int> x, y;
for(int i = 1; i < X.size(); i++) {
    if(!all.count(i)) continue;
    if(X[i] >= 0) x.pb(X[i]);
    else
        x.pb(mp[-X[i]]);

    if(Y[i] >= 0) y.pb(Y[i]);
    else
        y.pb(mp[-Y[i]]);
}
for(auto &to: sl) {
    if(to < 0) to = mp[-to];
}
answer(sl, x, y);
}

#ifdef LOCAL
int32_t main() {

}
#endif

Compilation message

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:117:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |     for(int i = 1; i < B.size(); i++) {
      |                    ~~^~~~~~~~~~
doll.cpp:126:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |     while((2 << now) < A.size()) {
      |           ~~~~~~~~~~~^~~~~~~~~~
doll.cpp:145:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 | for(int i = 1; i < X.size(); i++) {
      |                ~~^~~~~~~~~~
doll.cpp:157:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 | for(int i = 1; i < X.size(); i++) {
      |                ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 94 ms 12312 KB Output is correct
3 Correct 114 ms 13024 KB Output is correct
4 Correct 0 ms 312 KB Output is correct
5 Correct 13 ms 1492 KB Output is correct
6 Correct 148 ms 19148 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 94 ms 12312 KB Output is correct
3 Correct 114 ms 13024 KB Output is correct
4 Correct 0 ms 312 KB Output is correct
5 Correct 13 ms 1492 KB Output is correct
6 Correct 148 ms 19148 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 178 ms 22160 KB Output is correct
9 Correct 243 ms 24100 KB Output is correct
10 Correct 298 ms 34260 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 94 ms 12312 KB Output is correct
3 Correct 114 ms 13024 KB Output is correct
4 Correct 0 ms 312 KB Output is correct
5 Correct 13 ms 1492 KB Output is correct
6 Correct 148 ms 19148 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 178 ms 22160 KB Output is correct
9 Correct 243 ms 24100 KB Output is correct
10 Correct 298 ms 34260 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 0 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 294 ms 33720 KB Output is correct
15 Correct 229 ms 22820 KB Output is correct
16 Correct 289 ms 33600 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 1 ms 232 KB Output is correct
19 Correct 1 ms 212 KB Output is correct
20 Correct 288 ms 34128 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 53 ms 4772 KB Output is correct
3 Correct 133 ms 6944 KB Output is correct
4 Correct 124 ms 8480 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 53 ms 4772 KB Output is correct
3 Correct 133 ms 6944 KB Output is correct
4 Correct 124 ms 8480 KB Output is correct
5 Correct 290 ms 33580 KB Output is correct
6 Correct 305 ms 33248 KB Output is correct
7 Correct 287 ms 33344 KB Output is correct
8 Correct 298 ms 33160 KB Output is correct
9 Correct 184 ms 17596 KB Output is correct
10 Correct 283 ms 29968 KB Output is correct
11 Correct 285 ms 32956 KB Output is correct
12 Correct 215 ms 22332 KB Output is correct
13 Correct 167 ms 21456 KB Output is correct
14 Correct 230 ms 22620 KB Output is correct
15 Correct 213 ms 22684 KB Output is correct
16 Correct 5 ms 980 KB Output is correct
17 Correct 175 ms 21404 KB Output is correct
18 Correct 165 ms 21264 KB Output is correct
19 Correct 211 ms 22480 KB Output is correct
20 Correct 305 ms 32988 KB Output is correct
21 Correct 285 ms 32956 KB Output is correct
22 Correct 310 ms 32828 KB Output is correct