제출 #1363404

#제출 시각아이디문제언어결과실행 시간메모리
1363404solution6312Broken Device (JOI17_broken_device)C++17
100 / 100
14 ms1432 KiB
#include "Annalib.h"
#include <iostream>
#include <cassert>
#include <chrono>
#include <random>
#include <algorithm>
using namespace std;
using ll=long long;

void Set(int pos, int bit);
namespace encode
{
    int work[150], bit[61];
    void Anna(int N, ll X, int K, int P[])
    {
        for (int i=0; i<150; i++) work[i]=1;
        for (int i=0; i<K; i++) work[P[i]]=0;
        for (int i=0; i<60; i++) bit[i]=((X>>i)&1);
        bit[60]=0;
        int cnt=0;
        for (int i=0; i<150; i+=3)
        {
            int tot=work[i]+work[i+1]+work[i+2];
            if (tot<=1 || cnt>=60)
            {
                Set(i, 0);
                Set(i+1, 0);
                Set(i+2, 0);
                continue;
            }
            else if (tot==2)
            {
                if (bit[cnt])
                {
                    if (work[i+2])
                    {
                        Set(i, 0);
                        Set(i+1, 0);
                        Set(i+2, 1);
                    }
                    else
                    {
                        Set(i, 1);
                        Set(i+1, 1);
                        Set(i+2, 0);
                    }
                    cnt++;
                }
                else if (work[i+1])
                {
                    Set(i, 0);
                    Set(i+1, 1);
                    Set(i+2, 0);
                    cnt++;
                }
                else if (bit[cnt+1])
                {
                    Set(i, 1);
                    Set(i+1, 0);
                    Set(i+2, 1);
                    cnt+=2;
                }
                else
                {
                    Set(i, 1);
                    Set(i+1, 0);
                    Set(i+2, 0);
                    cnt+=2;
                }
            }
            else
            {
                if (!bit[cnt] && !bit[cnt+1])
                {
                    Set(i, 1);
                    Set(i+1, 0);
                    Set(i+2, 0);
                }
                else if (!bit[cnt] && bit[cnt+1])
                {
                    Set(i, 1);
                    Set(i+1, 0);
                    Set(i+2, 1);
                }
                else if (bit[cnt] && !bit[cnt+1])
                {
                    Set(i, 0);
                    Set(i+1, 1);
                    Set(i+2, 1);
                }
                else
                {
                    Set(i, 1);
                    Set(i+1, 1);
                    Set(i+2, 1);
                }
                cnt+=2;
            }
        }
    }
}
void Anna(int N, ll X, int K, int P[]) { encode::Anna(N, X, K, P); }
#include "Brunolib.h"
#include <iostream>
#include <cassert>
#include <chrono>
#include <random>
#include <algorithm>
using namespace std;
using ll=long long;

namespace decode
{
    int bit[61];
    ll Bruno(int N, int A[])
    {
        int cnt=0;
        for (int i=0; i<150; i+=3)
        {
            if (!A[i] && !A[i+1] && !A[i+2]) continue;
            else if (!A[i] && !A[i+1] && A[i+2]) bit[cnt++]=1;
            else if (!A[i] && A[i+1] && !A[i+2]) bit[cnt++]=0;
            else if (!A[i] && A[i+1] && A[i+2])
            {
                bit[cnt++]=1;
                bit[cnt++]=0;
            }
            else if (A[i] && !A[i+1] && !A[i+2])
            {
                bit[cnt++]=0;
                bit[cnt++]=0;
            }
            else if (A[i] && !A[i+1] && A[i+2])
            {
                bit[cnt++]=0;
                bit[cnt++]=1;
            }
            else if (A[i] && A[i+1] && !A[i+2]) bit[cnt++]=1;
            else
            {
                bit[cnt++]=1;
                bit[cnt++]=1;
            }
        }
        ll ans=0;
        for (int i=0; i<60; i++) if (bit[i]) ans^=(1ll<<i);
        return ans;
    }
}
ll Bruno(int N, int A[]) { return decode::Bruno(N, A); }
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…