제출 #1362699

#제출 시각아이디문제언어결과실행 시간메모리
1362699salmonChika Wants to Cheat (EGOI22_cheat)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;

namespace{
	bool adjmat[3][3][3][3];
	
	vector<pair<pair<int,int>,pair<int,int>>> equiv = 
	{
	{{0,0},{1,1}},
	{{0,0},{2,1}},
	{{0,0},{1,0}},
	{{1,0},{1,1}},
	{{1,0},{2,2}},
	{{1,0},{2,1}},
	{{1,0},{2,0}}	
	};
	
	void load(vector<pair<pair<int,int>,pair<int,int> >> v){
		for(int i = 0; i <= 2; i++){
			for(int j = 0; j <= 2; j++){
				for(int k = 0; k <= 2; k++){
					for(int l = 0; l <= 2; l++){	
						adjmat[i][j][k][l] = false;
					}
				}
			}
		}
		
		for(pair<pair<int,int>, pair<int,int>> ii : v){
			pair<int,int> ii1 = ii.first;
			pair<int,int> ii2 = ii.second;
			adjmat[ii1.first][ii1.second][ii2.first][ii2.second] = true;
			adjmat[ii2.first][ii2.second][ii1.first][ii1.second] = true;
		}
	}
	
	void rotate(vector<pair<pair<int,int>,pair<int,int>>> &v){
		for(pair<pair<int,int>,pair<int,int>> &ii : v){
			int temp = ii.first.first;
			
			ii.first.first = ii.first.second;
			ii.first.second = 2 - temp;
			
			temp = ii.second.first;
			
			ii.second.first = ii.second.second;
			ii.second.second = 2 - temp; 
		}
	}
	
	vector<int> decode(){
		vector<int> temp;
		
		for(int i = 0; i < 4; i++){
			int num = 0;
			for(int j = 0; j < 7; j++){
				pair<int,int> f = equiv[j].first;
				pair<int,int> s = equiv[j].second;
				
				if(adjmat[f.first][f.second][s.first][s.second]){
					num += (1<<j);
				}
			}
			temp.push_back(num);
			rotate(equiv);
		}
		
		return temp;
	}
}

vector<pair<pair<int, int>, pair<int, int>>> BuildPattern(int N){
	vector<pair<pair<int,int>,pair<int,int>>> v;
	
	
	for(int i = 0; i <= 2; i++){
		for(int j = 0; j <= 2; j++){
			for(int k = i; k <= 2; k++){
				for(int l = (k==i) * (j+1) ; l <= 2; l++){
					int dx = abs(k - i);
					int dy = abs(j - l);
					
					if(__gcd(dx,dy) != 1) continue;
					
					v.push_back({{i,j},{k,l} });
				}
			}
		}
	}
	
	int ans = 0;
	vector<int> code = {-1,-1,-1,-1};
	
	for(int i = 0; i < (1<<7); i++){
		for(int j = 0; j <= i; j++){
			if(ans + i * i >= N){
				int temp = N - ans - 1;
				code = {i,j,temp / i, temp % i};
				break;
			}
			ans += i * i;
			
			if(ans + j + 1 >= N){
				code = vector<int>{i,j,i,N - ans - 1};
				break;
			}
			ans += j + 1;
		}
		if(code[0] != -1) break;
	}
	
	vector<pair<pair<int,int>,pair<int,int>>> vec; 

	for(int i = 0; i < 4; i++){
		for(int j = 0; j < 7; j++){
			if((1<<j)&code[i]) vec.push_back(equiv[j]);
		}
		rotate(equiv);
	}

	return vec;
}

int GetCardNumber(vector<std::pair<std::pair<int, int>, std::pair<int, int>>> p){
	pair<vector<int>,int> ii = {{-1,-1,-1,-1},-1};
	
	for(int i = 0; i < 4; i++){
		load(p);
		ii = max(make_pair(decode(),i),ii);
		rotate(p);
	}
	
	int ans = 0;
	bool done = false;
	
	for(int i = 0; i < (1<<7); i++){
		for(int j = 0; j <= i; j++){
			if(ii.first[0] == i && ii.first[1] == j){
				if(ii.first[2] < i){
					ans += ii.first[2] * i + ii.first[3] + 1;
					done = true;
				}
				else{
					ans += i * i;
					ans += ii.first[3] + 1;
				}
			}
			
			if(done) break;
			ans +=  i * i;
			ans += j + 1;
		}
		if(done) break;
	}
	
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…