답안 #600809

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
600809 2022-07-21T08:00:33 Z MadokaMagicaFan 레지스터 (IOI21_registers) C++17
22 / 100
2 ms 468 KB
#include "bits/stdc++.h"

using namespace std;

using ll = long long;
const ll inf = 1e9;
const int md1 = 1e9+7;
const int md2 = 998244353;

#define sz(v)                       ((int)v.size())
#define pb                          push_back

#define pry                         cout << "YES\n"
#define prn                         cout << "NO\n"
#define endl                        '\n'

#define fst                         first
#define scn                         second

#define clear                       for (i = 0; i < B; ++i) { v[i] = 0; }
/* #define ONPC */

const int D = 99; // del extra
const int L = 98; // last bit
const int S = 97; // for sum
const int N = 96; // min
const int X = 95; // max
const int F = 94; // diff
const int T = 93; // temporary
const int B = 2000;
const int M = 100;
vector<bitset<B>> r(M);

void append_move(int t, int y);
void append_store(int t, vector<bool> v);
void append_and(int t, int x, int y);
void append_or(int t, int x, int y);
void append_xor(int t, int x, int y);
void append_not(int t, int x);
void append_left(int t, int x, int p);
void append_right(int t, int x, int p);
void append_add(int t, int x, int y);

void
fminmax(int a, int b, int k)
{
    append_not(F, b);
    append_and(F ,F, D);
    /* append_add(F ,F, S); */
    append_add(F ,F, a);
    append_and(F ,F, L);

    /* TODO improve */

    int s = 0;
    for (int j = 0; j < B; ++j) {
        if ((1<<(j+1))-1 > k) break;
        s = (1<<(j+1))-1;
        append_right(N, F, (1<<j));
        append_or(F,F,N);
    }
    /* for (int i = 0; i < k; ++i) { */
    /*     cout << r[F][i]; */
    /* } */
    /* cout << ' ' << s << endl; */

    if (s < k) {
        append_right(N, F, k-s);
        append_or(F,F,N);
    }

    /* for (int i = 0; i < k; ++i) { */
    /*     cout << r[F][i]; */
    /* } */
    /* cout << endl; */

    /* for (int i = 0; i < k+2; ++i) { */
    /*     cout << r[L][i]; */
    /* } */
    /* cout << endl; */

    append_and(X, F, a);
    append_and(N, F, b);
    append_not(F,F);
    append_and(T, F, a);
    append_or(N, N, T);
    append_and(T, F, b);
    append_or(X, X, T);
    return;
}

int
domin(int n, int k)
{
    int i, j, l;
    vector<bool> v(B, 0);

    if (n&1) {
        for (i = 0; i < k; ++i)
            v[n*k + i] = 1;

        append_store(1,v);
        append_or(0,0,1);

        ++n;
    }

    clear;
    for (i = 0; i < n; ++i) {
        if (i&1) continue;
        for (j = 0; j < k; ++j) v[i*k+j] = 1;
    }

    append_store(D,v); clear;

    for (i = 0; i < n; ++i) {
        if (i&1) continue;
        v[i*k+k] = 1;
    }

    append_store(L,v); clear;
    append_and(1, 0, D);
    append_right(2, 0, k);
    append_and(2, 2, D);

    fminmax(1,2,k);

    append_move(0,N);


    return n>>1;
}

void
construct_instructions(int s, int n, int k, int q)
{
    int i, j, l;
    assert(!s);

    if (!s) {
        while (n>1) {
            n = domin(n,k);
            k <<=1;
        }
        return;
    }
    vector<bool> v(B, 0);

    if (n&1) {
        for (i = 0; i < k; ++i)
            v[n*k + i] = 1;

        append_store(1,v);
        append_or(0,0,1);

        ++n;
    }

    clear;
    for (i = 0; i < n; ++i) {
        if (i&1) continue;
        for (j = 0; j < k; ++j) v[i*k+j] = 1;
    }

    append_store(D,v); clear;

    for (i = 0; i < n; ++i) {
        if (i&1) continue;
        v[i*k+k] = 1;
    }

    append_store(L,v); clear;


    /* for (i = 0; i < n; ++i) { */
    /*     if (i&1) continue; */
    /*     v[i*k] = 1; */
    /* } */

    /* append_store(S,v); clear; */

    append_and(1, 0, D);
    append_right(2, 0, k);
    append_and(2, 2, D);

    fminmax(1,2,k);

    append_move(0,N);


    return;
}

#ifdef ONPC
int op = 0;
void append_move(int t, int y){
    ++op;
    r[t] = r[y];
}
void append_store(int t, vector<bool> v){
    ++op;
    for (int i = 0; i < B; ++i) r[t][i] = v[i];
}

void append_and(int t, int x, int y){
    ++op;
    r[t] = (r[x]&r[y]);
}
void append_or(int t, int x, int y){
    ++op;
    r[t] = (r[x]|r[y]);
}
void append_xor(int t, int x, int y){
    ++op;
    r[t] = (r[x]^r[y]);
}
void append_not(int t, int x){
    ++op;
    r[t] = (~r[x]);
}
void append_left(int t, int x, int p){
    ++op;
    r[t] = (r[x]<<p);
}
void append_right(int t, int x, int p){
    ++op;
    r[t] = (r[x]>>p);
}
void append_add(int t, int x, int y){
    ++op;
    bitset<B> tmp;
    bool ex = 0;
    int cnt;
    for (int i = 0; i < B; ++i) {
        tmp[i] = (r[x][i]^r[y][i]^ex);
        cnt = 0;
        if (r[x][i]) ++cnt;
        if (r[y][i]) ++cnt;
        if (ex) ++cnt;

        ex = (cnt > 1);
    }

    r[t] = tmp;
}

void
solve()
{
    for (int i = 0; i < M; ++i) {
        for (int j = 0; j < B; ++j) {
            r[i][j] = 0;
        }
    }
    int n, k, x;

    cin >> n >> k;

    for (int i = 0; i < n; ++i) {
        cin >> x;
        for (int j = 0; j < k; ++j)
            if ((x>>j)&1) r[0][i*k+j] = 1;
    }

    construct_instructions(0,n,k,100);

    int ans = 0;

    for (int i = 0; i < k; ++i) {
        if (r[0][i]) ans |= (1<<i);
    }

    cout << ans << ' ' << op << endl;
}

int32_t
main(int argc, char **argv)
{
    if (argc >= 2) {
        freopen(argv[1], "r", stdin);
    } else
        ios_base::sync_with_stdio(0);cin.tie(0);
    int t = 1;
    /* cin >> t; */
    while(t--)
        solve();
}
#endif

Compilation message

registers.cpp: In function 'int domin(int, int)':
registers.cpp:95:15: warning: unused variable 'l' [-Wunused-variable]
   95 |     int i, j, l;
      |               ^
registers.cpp: In function 'void construct_instructions(int, int, int, int)':
registers.cpp:137:15: warning: unused variable 'l' [-Wunused-variable]
  137 |     int i, j, l;
      |               ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Wrong answer detected in grader
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 304 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 2 ms 324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Wrong answer detected in grader
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 468 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -