제출 #1186762

#제출 시각아이디문제언어결과실행 시간메모리
1186762ByeWorld죄수들의 도전 (IOI22_prison)C++20
53 / 100
9 ms1864 KiB
#include "prison.h"
#include <bits/stdc++.h>
#define ll long long
#define fi first 
#define se second
#define pb push_back
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<ll,pii> ipii;
const int MAXN = 3e5+100;
const ll INF = 2e18+10;
const int LOG = 12;

int n; 
vector<vector<int>> ANS;

int cek(int i, int v){
	int val = (i>>(2*v)) & 3;
	return val;
}
std::vector<std::vector<int>> devise_strategy(int N) {
	n = N;
	// cout << cek(2048,5) << ' ' <<cek(3072, 5) << " p\n";
	vector<int> vec; // mulai
	vec.pb(0); // buka a
	for(int i=1; i<=n; i++){
		// buka A, tulis i
		int val = cek(i, 6);
		if(val==2 || val==3) vec.pb(13 + 1);
		else vec.pb(12 + 1);
	}
	ANS.pb(vec);

	// bit -> 0 - 6
	// -2 --> b lebih kecil, -1 --> a 
	// 1-14 --> A ke B
	for(int j=1; j<=14; j++){ // kalo di board = j
		int p = j-1;
		int bit = p/2, ada = p%2; // 4^bit, 2/3 bukan
		vector<int> tem; tem.pb(1); // open b
		if(ada){ // 2 / 3
			for(int i=1; i<=n; i++){
				if(cek(i, bit)==2){ 
					tem.pb(2*bit + 15); // = 2 / 3
				} else if(cek(i,bit)==3){
					tem.pb(2*bit+1 + 15);
				} else tem.pb(-2); // b lebih kecil
			}
		} else { // 0 / 1
			for(int i=1; i<=n; i++){
				if(cek(i, bit)==2 || cek(i,bit)==3){
					tem.pb(-1); // a lebi kecil
				} else if(cek(i,bit)==0){
					tem.pb(2*bit + 15);
				} else tem.pb(2*bit+1 + 15); // = 0/1, tanya bit
			}
		}
		// cout << tem.size() << "siz2\n";
		ANS.pb(tem);
	}

	// 15 - 28 --> B ke A
	for(int j=15; j<=28; j++){ // kalo di board = j
		int p = j-15; // bitnya yg sblmnya
		int bit = p/2, big = p%2;
		vector<int> tem; tem.pb(0); // open a

		if(big){ // b bigger
			for(int i=1; i<=n; i++){
				if(cek(i,bit) == 3 || cek(i,bit) == 1){
					int b = bit-1;// lanjut
					int val = cek(i, b);
					if(val==2 || val==3) tem.pb(2*b+1 + 1);
					else tem.pb(2*b + 1);

				}else {
					tem.pb(-1); // a small
				}
			}
		} else { // b kecil
			for(int i=1; i<=n; i++){
				if(cek(i,bit) == 2 || cek(i,bit) == 0){
					int b = bit-1; // lanjut
					int val = cek(i, b);
					if(val==2 || val==3) tem.pb(2*b+1 + 1);
					else tem.pb(2*b + 1);
				} else {
					tem.pb(-2); // b small
				}
			}
		}
		// cout << tem.size() << "siz\n";
		ANS.pb(tem);
	}
	return ANS;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...