제출 #1363613

#제출 시각아이디문제언어결과실행 시간메모리
1363613xorshift마술쇼 (APIO24_show)C++20
0 / 100
1101 ms588 KiB
#include <bits/stdc++.h>
#include "Alice.h"
using namespace std;

using ll = long long;
using vint = vector<int>;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;

#define fi first
#define se second 
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (a)-1; i >= (b); i--)

const int BITS = 60000;
const int VBITS = 60;
const int n = 5000;

vpint Alice(){
    ll x = setN(n);

    bitset<BITS> b, bv(x);
    rep(i, BITS/VBITS) {
        b |= bv << i*VBITS;
    }
    vint p(n, -1);
    int b_count = 0;
    rrep(i, n) {
        if (i == 0) continue;
        int b_size = __lg(i);
        int j = ((b >> b_count) << (BITS-b_size) >> (BITS-b_size)).to_ulong();
        p[i] = j;
        b_count += b_size;
    }
    vpint res;
    rep(i, n) if (p[i] != -1) 
        res.push_back({p[i]+1, i+1});
    return res;
}
#include <bits/stdc++.h>
#include "Bob.h"
using namespace std;

using ll = long long;
using vint = vector<int>;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;

#define fi first
#define se second 
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (a)-1; i >= (b); i--)

const int BITS = 60000;
const int VBITS = 60;
const int n = 5000;

ll Bob(vpint V){
    vint p(n, -1);
    for (auto& [j, i]: V) p[i-1] = j-1;
	bitset<BITS> b, b_rec;
    int b_count = 0;
    rrep(i, n) {
        if (i == 0) continue;
        int b_size = __lg(i);
        int j = p[i];
        if (j != -1) {
            bitset<BITS> bv(j);
            b |= bv << b_count;
            bitset<BITS> rv((1 << b_size)-1);
            b_rec |= rv << b_count;
        }
        b_count += b_size;
    }
    bitset<VBITS> xb, xb_rec;
    rep(i, BITS/VBITS) {
        rep(j, VBITS) {
            int pos = i*VBITS+j;
            if (b_rec[pos]) xb_rec[j] = b_rec[pos];
            if (b_rec[pos]) xb[j] = b[pos];
        }
    }
    if (xb_rec.count() != VBITS) while (true) {}
    else {
        ll x = xb.to_ullong();
        return x;
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…