답안 #523089

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523089 2022-02-07T03:45:35 Z amunduzbaev Ancient Machine (JOI21_ancient_machine) C++17
0 / 100
53 ms 11072 KB
#include "Anna.h"
#include "bits/stdc++.h"
using namespace std;

#define ar array

void Anna(int n, vector<char> s) {
	vector<int> res(n);
	ar<int, 3> last {n, n, n};
	vector<ar<int, 3>> par(n + 1); par[n] = last;
	vector<ar<int, 3>> rap(n); 
	for(int i=n-1;~i;i--){
		last[s[i] - 'X'] = i;
		par[i] = last;
	}
	
	last = {-1, -1, -1};
	for(int i=0;i<n;i++){
		last[s[i] - 'X'] = i;
		rap[i] = last;
	}
	
	int i = par[0][0];
	vector<int> tt, tmp;
	if(i < n){
		int j = i; tt.push_back(i);
		while(j < n){
			j = par[j][1];
			int l = par[j][2];
			if(l < n){
				tt.push_back(j);
				tt.push_back(l);
			} j = l;
		}
	} i = rap[n - 1][2];
	if(~i){
		int j = i; tmp.push_back(i);
		while(~j){
			j = rap[j][1];
			if(~j){
				int l = rap[j][0];
				if(~l){
					tmp.push_back(j);
					tmp.push_back(l);
				} j = l;
			}
		}
	}
	
	int l = (int)tmp.size() - 1;
	ar<int, 2> r {l / 2, 0};
	for(int i=2;i<(int)tt.size();i+=2){
		while(l>0 && tmp[l] <= tt[i]) l-=2;
		r = max(r, {i / 2 + l / 2, i + 1});
	}
	
	for(int j=0;j<20;j++) Send(r[1] >> j & 1);
	
	for(int i=0;i<r[1];i++){
		res[tt[i]] = 1;
	}
	for(int i=0;i<(int)tmp.size();i++){
		if(r[1] && tmp[i] <= tt[r[1] - 1]) break;
		res[tmp[i]] = 1;
	}
	
	for(int i=0;i<n;i++){
		Send(res[i]);
	}
}
#include "Bruno.h"
#include "bits/stdc++.h"
using namespace std;

void Bruno(int n, int l, vector<int> a) {
	vector<int> res, tot;
	int x = 0;
	for(int j=0;j<20;j++) x |= (a[j] << j);
	a.erase(a.begin(), a.begin() + 20);
	for(int i=0;i<n;i++){
		if(a[i]) tot.push_back(i);
	}
	auto add = [&](int l, int r){
		for(int i=l;i<=r;i++){
			//~ cout<<i<<endl;
			Remove(i);
		}
	};
	
	int lx = 0;
	if(x){
		add(0, tot[0] - 1);
		for(int i=1;i<x;i+=2){
			add(tot[i-1] + 1, tot[i] - 1);
			add(tot[i] + 1, tot[i+1] - 1);
			Remove(tot[i]);
			Remove(tot[i+1]);
		} Remove(tot[0]);
		lx = tot[x - 1] + 1;
	}
	
	tot.erase(tot.begin(), tot.begin() + x);
	reverse(tot.begin(), tot.end());
	if(!tot.empty()){
		add(tot[0] + 1, n - 1);
		for(int i=1;i<(int)tot.size();i+=2){
			add(tot[i] + 1, tot[i-1] - 1);
			add(tot[i+1] + 1, tot[i] - 1);
			Remove(tot[i]);
			Remove(tot[i+1]);
		} Remove(tot[0]);
		add(lx, tot.back() - 1);
	} else add(lx, n - 1);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 500 KB Output is correct
2 Correct 0 ms 584 KB Output is correct
3 Correct 0 ms 580 KB Output is correct
4 Correct 0 ms 496 KB Output is correct
5 Incorrect 0 ms 488 KB Wrong Answer [6]
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 11072 KB Wrong Answer [6]
2 Halted 0 ms 0 KB -