이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |