제출 #990666

#제출 시각아이디문제언어결과실행 시간메모리
990666efishelBroken Device (JOI17_broken_device)C++17
100 / 100
36 ms2748 KiB
#include "Annalib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;

static mt19937_64 rngA(0xccff00);

void Anna (int n, ll x, int k, int p[]) {
    vll to(n);
    iota(to.begin(), to.end(), 0);
    shuffle(to.begin(), to.end(), rngA);
    vector <char> broken(n, false);
    for (ll i : vll(p, p+k)) broken[to[i]] = true;
    vll th(38, -15);
    for (ll i = 0; i < 38; i++) {
        th[i] = x%3;
        x /= 3;
    }
    // 00 none
    // 01 0
    // 10 1
    // 11 2
    ll at = 0;
    ll i = 0;
    vll set(n, 0);
    for (; i < n; i += 2) {
        if (at == 38) break;
        switch (th[at]) {
            case 0:
            if (broken[i+1]) break;
            set[i] = 0;
            set[i+1] = 1;
            at++;
            break;
            case 1:
            if (broken[i]) break;
            set[i] = 1;
            set[i+1] = 0;
            at++;
            break;
            case 2:
            if (broken[i] || broken[i+1]) break;
            set[i] = 1;
            set[i+1] = 1;
            at++;
            break;
            default:
            assert(false);
        }
    }
    for (ll i = 0; i < n; i++) {
        Set(i, set[to[i]]);
    }
}
#include "Brunolib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;

static mt19937_64 rngB(0xccff00);

ll Bruno (int n, int a[]) {
    vll orig(a, a+n);
    vll to(n);
    iota(to.begin(), to.end(), 0);
    shuffle(to.begin(), to.end(), rngB);
    vll ve(n);
    for (ll i = 0; i < n; i++) ve[to[i]] = orig[i];
    vll th(38);
    ll at = 0;
    for (ll i = 0; i < n; i += 2) {
        if (at == 38) break;
        if (ve[i] == 0 && ve[i+1] == 0) continue;
        th[at++] = (
            ve[i] == 0 && ve[i+1] == 1 ? 0 :
            ve[i] == 1 && ve[i+1] == 0 ? 1 :
            ve[i] == 1 && ve[i+1] == 1 ? 2 : -15
        );
    }
    ll ans = 0;
    ll thr = 1;
    for (ll i = 0; i < 38; i++) {
        ans += th[i]*thr;
        thr *= 3;
    }
    cerr << ans << " ans\n";
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...