제출 #575468

#제출 시각아이디문제언어결과실행 시간메모리
575468ArvinAncient Machine (JOI21_ancient_machine)C++17
90 / 100
67 ms9028 KiB
#include "Anna.h"
#include <bits/stdc++.h>
	
using namespace std;
	
#define ll long long
	
namespace {
	
int variable_example = 0;
	const int maxN = 1e5 + 5;	
}
	
struct SegmentTree {
	int tree[2*maxN];
	int n;
	
	void reset(){
		fill(tree, tree+2*maxN, 1e9);
	}
	
	void build(int n, vector<int> &v){
		this->n = n;
		for(int x=0;x<n;x++){
			tree[n+x] = v[x];
		}
		for(int x=n-1;x>0;x--){
			tree[x] = min(tree[x<<1], tree[x<<1|1]);
		}
	}
	
	void update(int pos, int val){
		pos += n;
	
		tree[pos] = val;
		for(int x=pos;x>1;x>>=1){
			tree[x>>1] = min(tree[x], tree[x^1]);
		}
	}
	
	int query(int left, int right){ // [L, R)
		int ans = 1e9;
		for(left += n, right += n; left < right; left >>= 1, right >>= 1){
			if(left&1){
				ans = min(ans, tree[left++]);
			}
			if(right&1){
				ans = min(ans, tree[--right]);
			}
		}
		return ans;
	}
} tree;
	
void Anna(int N, std::vector<char> S) {
	// 1 as store this first X or any Z after first Xa
	// 0 otherwise
	
	vector<int> v;
	int pos = -1;
	bool fX = false;
	for(int x=0;x<N;x++){
		if(S[x] == 'Z'){
			if(fX && (x+1 == N || S[x+1] != 'Z')){
				v.push_back(1);
			} else {
				v.push_back(0);
			}
			// Send(fX);
		} else if(S[x] == 'Y'){
			// Send(0);
			v.push_back(0);
		} else if(S[x] == 'X'){
			if(!fX){
				v.push_back(1);
				// Send(1);
				fX = true;
				pos = x;
			} else {
				v.push_back(0);
				// Send(0);
			}
		}
	}
	
	// guaranteed bit 1 at most N/2 + 1
	// alternating, only special case where first X and any Z are adjacent.

	// first 16 bits are location of first X
	// if not exist: ok delete all
	// else :
	// check first bit after loc
	// if 0 length is odd
	// - if one:
	// - - 
	// - else:

	for(int x=0;x<17;x++){
		if((pos+1)&(1 << x)){
			Send(1);
		} else {
			Send(0);
		}
	}
	
	// 1010
	// 1001
	// 0101
	// 1000
	// 0100
	// 0010
	// 0001
	// 0000
	
	map<int, int> mp;
	int cnt = 0;
	for(int x=0;x<16;x++){
		bool ok = true;
		int lst = -2;
		for(int y=0;y<4;y++){
			if(x&(1 << y)){
				if(y-lst <= 1){
					ok = false;
					break;
				}
				lst = y;
			}
		}
		
		if(ok){
			mp[x] = cnt++;
		}
	}
	
	if(pos != -1){
		for(int x=pos+1;x<N;x+=4){
			int state = 0;
			for(int y=0;y<4;y++){
				if(x+y >= N){
					continue;
				}
				
				if(v[x+y] == 1){
					state |= (1 << y);
				}
			}
			
			for(int y=0;y<3;y++){
				if(mp[state]&(1 << y)){
					Send(1);
				} else {
					Send(0);
				}
			}
		}
	}
	// Send(v[0]);
	// bool skip = false;
	// for(int x=0;x<N;x++){
	// 	if(skip){
	// 		skip = false;
	// 		continue;
	// 	}
	
	// 	if(v[x] == 0){
	// 		if(x+1 == N || v[x+1] == 1){
	// 			Send(0);
	// 			if(x+1 < N && v[x+1] == 1) Send(1);
	// 			else Send(0);
	// 		} else {
	// 			Send(1);
	// 			if(x+2 < N && v[x+2] == 1){
	// 				Send(1);
	// 			} else {
	// 				Send(0);
	// 			}
	// 			skip = true;
	// 		}
	// 	}
	// }
}
#include "Bruno.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

namespace {

int variable_example = 0;

int FunctionExample(int P) { return 1 - P; }

}  // namespace

void Bruno(int N, int L, std::vector<int> A) {
//	for (int i = 0; i < L; i++) {
//	variable_example += FunctionExample(A[i]);
//	}
	// assert(L <= N);
	

	// length >= 3, use 1 + log2(length) bits
	// length <= 2
//	for(auto val : A){
//		cout << val << " ";
//	}cout << "\n";
	vector<int> v(N, 0);
	int idx = 0;
	for(int x=0;x<17;x++){
		if(A[x] == 1){
			idx += (1 << x);
		}
	}
	
	if(idx == 0){
		for(int x=0;x<N;x++){
			Remove(x);
		}
		return;
	}
	
//	cout << idx << " =\n";
	idx--;
	v[idx] = 1;
	idx++;
	
	map<int, int> mp;
	int cnt = 0;
	for(int x=0;x<16;x++){
		bool ok = true;
		int lst = -2;
		for(int y=0;y<4;y++){
			if(x&(1 << y)){
				if(y-lst <= 1){
					ok = false;
					break;
				}
				lst = y;
			}
		}
		
		if(ok){
			mp[cnt++] = x;
		}
	}
	
	int pos = 17;
	while(pos < L){
		int state = 0;
		for(int y=0;y<3;y++){
			if(A[pos++] == 1){
				state += (1 << y);
			}
		}
		
		int val = mp[state];
		for(int y=0;y<4;y++){
			if(idx >= N) break;
			v[idx++] = ((val&(1 << y)) != 0);
		}
	}
	// for(auto val : v){
	// 	cout << val << "\n";
	// }
	// cout << v.size() << "\n";
	vector<int> ans;
	pos = -1;
	int lst = 0;
	for(int x=0;x<v.size();x++){
		if(v[x] == 1){
			if(pos == -1){
				pos = x;
				lst = x+1;
			} else {
				for(int y=x-1;y>=lst;y--){
					ans.push_back(y);
				}
				ans.push_back(x);
				lst = x+1;
			}
		}
	}
	
	for(int x=0;x<=pos;x++){
		ans.push_back(x);
	}
	for(int x=lst;x<N;x++){
		ans.push_back(x);
	}

	for(auto val : ans){
		// cout << "- " << val << "\n";
		Remove(val);
	}
}

컴파일 시 표준 에러 (stderr) 메시지

Anna.cpp:10:5: warning: '{anonymous}::variable_example' defined but not used [-Wunused-variable]
   10 | int variable_example = 0;
      |     ^~~~~~~~~~~~~~~~

Bruno.cpp: In function 'void Bruno(int, int, std::vector<int>)':
Bruno.cpp:90:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |  for(int x=0;x<v.size();x++){
      |              ~^~~~~~~~~
Bruno.cpp: At global scope:
Bruno.cpp:12:5: warning: 'int {anonymous}::FunctionExample(int)' defined but not used [-Wunused-function]
   12 | int FunctionExample(int P) { return 1 - P; }
      |     ^~~~~~~~~~~~~~~
Bruno.cpp:10:5: warning: '{anonymous}::variable_example' defined but not used [-Wunused-variable]
   10 | int variable_example = 0;
      |     ^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...