제출 #346643

#제출 시각아이디문제언어결과실행 시간메모리
346643jamielimUnscrambling a Messy Bug (IOI16_messy)C++14
100 / 100
3 ms640 KiB
#include <bits/stdc++.h>
#include "messy.h"
using namespace std;
#define pb push_back

string str;

void add(int s,int e){
	if(s+1==e){
		str[s]='1';
		add_element(str);
		str[s]='0';
		return;
	}
	int m=(s+e)/2;
	for(int i=s;i<=m;i++){
		str[i]='1';
		add_element(str);
		str[i]='0';
	}
	for(int i=s;i<=m;i++)str[i]='1';
	add(m+1,e);
	for(int i=s;i<=m;i++)str[i]='0';
	for(int i=m+1;i<=e;i++)str[i]='1';
	add(s,m);
}

vector<int> ans;

void check(int s,int e,vector<int> cur){
	if(s+1==e){
		str[cur[0]]='1';
		if(check_element(str)){
			str[cur[0]]='0';
			ans[cur[0]]=s;
			ans[cur[1]]=e;
		}else{
			str[cur[0]]='0';
			ans[cur[0]]=e;
			ans[cur[1]]=s;
		}
		return;
	}
	int m=(s+e)/2;
	vector<int> left,right;
	for(int i=0;i<(int)cur.size();i++){
		str[cur[i]]='1';
		if(check_element(str)){
			left.pb(cur[i]);
		}else{
			right.pb(cur[i]);
		}
		str[cur[i]]='0';
	}
	for(int i=0;i<(int)left.size();i++)str[left[i]]='1';
	check(m+1,e,right);
	for(int i=0;i<(int)left.size();i++)str[left[i]]='0';
	for(int i=0;i<(int)right.size();i++)str[right[i]]='1';
	check(s,m,left);
}

vector<int> restore_permutation(int n, int w, int r) {
    for(int i=0;i<n;i++)str.pb('0');
    add(0,n-1);
    compile_set();
    ans.resize(n);
    for(int i=0;i<n;i++)str[i]='0';
    vector<int> temp;
    for(int i=0;i<n;i++)temp.pb(i);
    check(0,n-1,temp);
    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...