Submission #989342

# Submission time Handle Problem Language Result Execution time Memory
989342 2024-05-28T02:45:23 Z steveonalex Mechanical Doll (IOI18_doll) C++17
70.6719 / 100
159 ms 26164 KB
#include <bits/stdc++.h>
#include "doll.h"
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
#define MASK(i) (1ULL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
#define ALL(v) (v).begin(), (v).end()
 
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
 
ll LASTBIT(ll mask){return (mask) & (-mask);}
int pop_cnt(ll mask){return __builtin_popcountll(mask);}
int ctz(ull mask){return __builtin_ctzll(mask);}
int logOf(ull mask){return 63 - __builtin_clzll(mask);}
 
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);}
 
template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b) {a = b; return true;}
        return false;
    }
 
template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b) {a = b; return true;}
        return false;
    }
 
template <class T>
    void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){
        for(auto item: container) out << item << separator;
        out << finish;
    }
 
template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }
 
void create_circuit(int m, vector<int> a);
namespace Grader{
    int n, m;
    vector<int> a;
    void answer(vector<int> C, vector<int> X, vector<int> Y){
        cout << n << "\n";
 
        if (X.size() > n * 2) {
            cout << "Wrong answer! (switch limit exceeded)\n";
            exit(1);
        } 
 
        cout << "Validating...\n";
        int ball = 0;
        vector<int> ans;
        vector<bool> state(X.size());
        while(ball != 0 || ans.empty()){
            // cout << "Ball: " << ball << endl;
            if (ball > 0) ans.push_back(ball);
            if (ball >= 0){
                ball = C[ball];
            }
            else {
                int cur = (-ball) - 1;
                if (state[cur]){
                    state[cur] = false;
                    ball = Y[cur];
                }
                else{
                    state[cur] = true;
                    ball = X[cur];
                }
            }
        }
 
        if (ans != a) cout << "Wrong answer! (incorrect sequence produced)\n";
        else if (*max_element(ALL(state)) == 1) cout << "Wrong answer! (there exists an Y switch)\n";
        else {
            cout << "Correct answer!\n";
            cout << "Switch used: " << X.size() << "\n";
            return;
        }
        exit(1);
    }
 
    void solve(){
        // cin >> n >> m;
        n = rngesus(1, 1024), m = rngesus(1, 1024);
        a = vector<int>(n);
        for(int i = 0; i<n; ++i) a[i] = rngesus(1, m);
 
        create_circuit(m, a);
    }
 
}
 
// using namespace Grader;
 
void toss(vector<int> &a){
    int n = a.size();
    vector<int> st(n*2);
 
    for(int i: a){
        int idx = 1;
        while(idx < n){
            if (!st[idx]){
                st[idx] = 1;
                idx = idx * 2;
            }
            else{
                st[idx] = 0;
                idx = idx * 2 + 1;
            }
        }
        st[idx] = i;
    }
 
    for(int i = n; i<n*2; ++i) a[i-n] = st[i];
}
 
void create_circuit(int m, vector<int> a) {
    vector<int> C(m+1, 0);
    vector<int> X, Y;
 
    int n = a.size();
    for(int i = 1; i<=m; ++i) C[i] = -1;
    C[0] = a[0];
 
    a.erase(a.begin());

 
    int k = MASK(logOf(a.size()) + 1);
    vector<int> perm(k);
    for(int i = 0; i<k; ++i) perm[i] = i;
    a.push_back(0);
    n = a.size();

    toss(perm);

    vector<int> b;
    for(int i = k-n; i < k; ++i) b.push_back(perm[i]);
    sort(ALL(b));
    map<int, int> mp;
    for(int i = 0; i<b.size(); ++i)
        mp[b[i]] = a[i];

    vector<int> kus(k, -1);
    for(int i = k-n; i<k; ++i) kus[i] = mp[perm[i]];

    int cur = 0;
    vector<int> mariana(k);
    for(int j: kus) mariana.push_back(j);
    mariana[1] = --cur;

    vector<int> check(mariana.size());
    for(int i = 1; i<k*2; ++i) if (mariana[i] == -1) check[i] = 1;
    int ma = 0;
    for(int i = k-1; i>=1; --i) {
        if (check[i * 2] && check[i * 2 + 1]){
            check[i] = check[i * 2] + 1;
        }
        maximize(ma, check[i]);
    }

    for(int j = 1; j < ma; ++j){
        cur--;
        X.push_back(cur+1); Y.push_back(cur+1);
    }

    for(int i = 2; i<k; ++i){
        if (check[i] == 0){
            mariana[i] = --cur;
        }
        else mariana[i] = -check[i];
    }

    while(X.size() < -cur){
        X.push_back(0);
        Y.push_back(0);
    }

    for(int i = 1; i<k; ++i){
        int pos = -mariana[i] - 1;
        X[pos] = mariana[i * 2];
        Y[pos] = mariana[i * 2 + 1];
    }

    
    answer(C, X, Y);
}
 
 
// int main(void){
//     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
 
//     int t; cin >> t;
//     for(int iteration = 1; iteration <= t; ++iteration)
//     solve();
 
//     return 0;
// }

Compilation message

doll.cpp: In function 'void Grader::answer(std::vector<int>, std::vector<int>, std::vector<int>)':
doll.cpp:55:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   55 |         if (X.size() > n * 2) {
      |             ~~~~~~~~~^~~~~~~
doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:151:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  151 |     for(int i = 0; i<b.size(); ++i)
      |                    ~^~~~~~~~~
doll.cpp:184:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  184 |     while(X.size() < -cur){
      |           ~~~~~~~~~^~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Partially correct 0 ms 348 KB Output is partially correct
2 Correct 75 ms 15948 KB Output is correct
3 Partially correct 88 ms 19240 KB Output is partially correct
4 Partially correct 154 ms 25440 KB Output is partially correct
# Verdict Execution time Memory Grader output
1 Partially correct 0 ms 348 KB Output is partially correct
2 Correct 75 ms 15948 KB Output is correct
3 Partially correct 88 ms 19240 KB Output is partially correct
4 Partially correct 154 ms 25440 KB Output is partially correct
5 Partially correct 159 ms 26008 KB Output is partially correct
6 Partially correct 157 ms 26164 KB Output is partially correct
7 Partially correct 154 ms 26092 KB Output is partially correct
8 Partially correct 155 ms 25912 KB Output is partially correct
9 Partially correct 100 ms 19272 KB Output is partially correct
10 Partially correct 154 ms 25764 KB Output is partially correct
11 Partially correct 151 ms 25652 KB Output is partially correct
12 Partially correct 89 ms 19300 KB Output is partially correct
13 Correct 75 ms 16492 KB Output is correct
14 Partially correct 89 ms 19524 KB Output is partially correct
15 Partially correct 87 ms 19468 KB Output is partially correct
16 Partially correct 3 ms 856 KB Output is partially correct
17 Correct 78 ms 16200 KB Output is correct
18 Correct 77 ms 16368 KB Output is correct
19 Partially correct 87 ms 19276 KB Output is partially correct
20 Partially correct 159 ms 25756 KB Output is partially correct
21 Partially correct 152 ms 25656 KB Output is partially correct
22 Partially correct 157 ms 25908 KB Output is partially correct