Submission #1348407

#TimeUsernameProblemLanguageResultExecution timeMemory
1348407SofiatpcChika Wants to Cheat (EGOI22_cheat)C++20
29 / 100
3 ms836 KiB
#include <bits/stdc++.h>
#include "cheat.h"

using namespace std;

#define fi first
#define sc second
#define sz(v) (int)v.size()

int dp[10] = {0, 48, 960, 16128, 261120, 4190208, 67092480}, val[10];
//DEPOIS DAR SWAP EM TODO OS PARES PARA QUE <
//TUDO SENTIDO ANTI-HORARIO
vector < vector< pair<pair<int, int>, pair<int, int>> > > lin = { 
    { { {0,0}, {1,0} } , { {2,0}, {2,1} }, { {1,2}, {2,2} }, { {0,1}, {0,2} } },
    { { {0,0}, {0,1} } , { {1,0}, {2,0} }, { {2,1}, {2,2} }, { {0,2}, {1,2} } },
    { { {0,0}, {2,1} } , { {0,2}, {1,0} }, { {1,2}, {2,0} }, { {0,1}, {2,2} } },
    { { {0,0}, {1,2} } , { {1,0}, {2,2} }, { {0,1}, {2,0} }, { {0,2}, {2,1} } },
    { { {0,0}, {1,1} } , { {1,1}, {2,0} }, { {1,1}, {2,2} }, { {0,2}, {1,1} } },
    { { {1,0}, {2,1} } , { {1,2}, {2,1} }, { {0,1}, {1,2} }, { {0,1}, {1,0} } },
    { { {1,0}, {1,1} } , { {1,1}, {2,1} }, { {1,1}, {1,2} }, { {0,1}, {1,1} } },
};
vector< pair<pair<int, int>, pair<int, int>> > pat;

void codifica(int x, int g){
    for(int i = 0; i < 4; i++)
        if(x & (1<<i)){
            pat.push_back( lin[g][i] );
        }
}

void cyclic(int i){
    int x = val[i]&8;
    val[i] <<= 1;
    if(x)val[i] -= 15; //-16 + 1
}

vector< pair<pair<int, int>, pair<int, int>> > BuildPattern(int n){
    pat.clear();

    int x = 805306368;
    for(int i = 6; i >= 0; i--){
        x/=16;
        if(i!= 0 && 4*dp[i-1] > n){
            int qual = n/dp[i-1];
            if(qual == 0)codifica(0, i); //0000
            else if(qual == 1)codifica(5, i); //0101
            else if(qual == 2)codifica(10, i); //1010
            else codifica(15, i); //1111
            
            n -= dp[i-1]*qual;
        }else{
            n -= 4*dp[i-1];
            x /= 3;

            int qual = n/x;
            if(qual == 0)codifica(1, i); //0001
            else if(qual == 1)codifica(3, i); //0011
            else codifica(7, i); //0111

            n -= qual*x;

            for(int j = 0; j < i; j++){
                int num = 0;
                for(int k = 3; k >= 0; k--)num += (n&(1<<k));
                n /= (1<<4);

                codifica(num,j);
            }
            break;
        }
    }

    return pat;
}

int GetCardNumber(vector<pair<pair<int, int>, pair<int, int>>> p){
    for(int i = 0; i < 7; i++) val[i] = 0;

    for(int i = 0; i < sz(p); i++){
        if(p[i].fi > p[i].sc)swap(p[i].fi, p[i].sc);

        int achei = 0;
        for(int j = 0; j < 7; j++){
            for(int k = 0; k < 4; k++)
                if(lin[j][k] == p[i]){
                    val[j] += (1<<k);
                    achei = 1; break;
                }
            if(achei)break;
        }
    }

    int s = 0, id;
    for(int i = 6; i >= 0; i--){

        int b = __builtin_popcount(val[i]);
        if(b == 0 || b == 4 || val[i] == 5 || val[i] == 10)continue;

        if(b == 1){
            while(val[i] != 1){cyclic(i); s++;}
        }else if( b == 2){
            while(val[i] != 3){cyclic(i); s++;}
        }else {
            while(val[i] != 7){cyclic(i); s++;}
        }
        id = i;
        break;
    }

    for(int i = 0; i < 7; i++){
        if(i == id)continue;
        for(int j = 0; j < s; j++)cyclic(i);
    }

    int ans = 0, x = 1;
    for(int i = 0; i < id; i++){
        x *= 16;
        ans += val[i]*(1<<(4*i));
    }

    if(val[id] == 3)ans += x;
    else if(val[id] == 7)ans += 2*x;

    ans += 4*dp[id-1];
    for(int i = id+1; i < 7; i++){
        if(val[i] == 5)ans += dp[i-1];
        else if(val[i] == 10)ans += 2*dp[i-1];
        else if(val[i] == 15)ans += 3*dp[i-1];
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...