제출 #203192

#제출 시각아이디문제언어결과실행 시간메모리
203192davitmargUnscrambling a Messy Bug (IOI16_messy)C++17
100 / 100
7 ms636 KiB
/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <bitset>
#include <stack>
#include <cassert>
#include <iterator>
#include <bitset>
#include <ctype.h>
#include <fstream>
#define mod 1000000007ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(),v.end()

#ifndef  death
#include "messy.h"
#endif


using namespace std;


#ifdef death

map<string, bool> USED;
vector<int> P;

void add_element(string s)
{
	string t = s;
	for (int i = 0; i < P.size(); i++)
		t[i] = s[P[i]];
	cout << "ADD " << s << " = " << t << endl;
	USED[t] = 1;
}

void compile_set()
{

}

bool check_element(string s)
{
	cout << "CHECK " << s << " " << USED[s] << endl;
	return USED[s];
}

#endif

int n, w, r;
vector<int> p,ans;
string s;

void add(int l, int r)
{
	if (l == r)
		return;
	string x(n,'0');
	for (int i = r + 1; i < n; i++)
		x[i] = '1';
	for (int i = 0; i < l; i++)
		x[i] = '1';
	int m = (l + r) / 2;
	for (int i = l; i <= m; i++)
	{
		x[i] = '1';
		add_element(x);
		x[i] = '0';
	}
	add(l, m);
	add(m + 1, r);
}

string OR(string a, string b)
{
	for (int i = 0; i < n; i++)
		a[i] = max(a[i], b[i]);
	return a;
}

string solve(int l, int r,int k,string mask)
{
	//cout << l << " : " << r << " = " << mask << endl;
	string lmask = mask, rmask = mask, nmask = string(n, '0');
	int m = (l + r) / 2;
	for (int i = 0; i < n; i++)
		if (mask[i] == '0')
		{
			mask[i] = '1';
			int f = check_element(mask);
			if (f)
			{
				rmask[i] = '1';
				nmask[i] = '1';
			}
			else
				lmask[i] = '1';
			p[i] += k * !f;
			mask[i] = '0';
		}
	if (l+1 == r)
		return nmask;
	rmask = OR(rmask, solve(l, m, k / 2, lmask));
	return (nmask, solve(m + 1, r, k / 2, rmask));
}

int Main()
{
	p.resize(n);
	add(0, n - 1);
	compile_set();
	s = string(n, '0');
	solve(0, n - 1, n / 2, s);
	return 0;
}

vector<int> restore_permutation(int N, int W, int R)
{
	w = W;
	r = R;
	n = N;
	Main();
	ans = p;
	/*for (int i = 0; i < n; i++)
		ans[p[i]] = i;*/
	return ans;
}


#ifdef death

int main()
{
	int N, R=0, W=0;
	cin >> N;// >> W >> R;
	for (int i = 0; i < N; i++)
	{
		P.PB(0);
		cin >> P.back();
	}
	P = restore_permutation(N, W, R);
	for (int i = 0; i < N; i++)
		cout << P[i] << " ";
	cout << endl;
	return 0;
}

#endif

/*

8 0 0
1 7 3 2 5 0 4 6


*/

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

messy.cpp: In function 'std::__cxx11::string solve(int, int, int, std::__cxx11::string)':
messy.cpp:115:45: warning: left operand of comma operator has no effect [-Wunused-value]
  return (nmask, solve(m + 1, r, k / 2, rmask));
                                             ^
#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...