답안 #233035

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
233035 2020-05-19T01:02:15 Z amoo_safar Zagonetka (COI18_zagonetka) C++14
0 / 100
85 ms 504 KB
#include <bits/stdc++.h>

#define pb push_back
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " : " << x << '\n'

using namespace std;

typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<ll, ll> pll;

const ll Mod = 1000000007LL;
const int N = 1e2 + 10;
const ll Inf = 2242545357980376863LL;
const ll Log = 30;

ll p[N], q[N], ind[N];
vector<ll> G[N], top;
ll L, R;
int mk[N], n;
void DFS(int u){
	mk[u] = 1;
	for(auto adj : G[u]) if(!mk[adj] && L <= p[adj] && p[adj] <= R) DFS(adj);
	top.pb(u);
}
bool Val(int x){
	memset(mk, 0, sizeof mk);
	top.clear();
	for(int i = L; i <= R; i++){
		if(!mk[ind[i]]){
			DFS(ind[i]);
		}
	}
	reverse(all(top));
	memcpy(q, p, sizeof p);
	//cerr << "$$ " << top.size() << '\n';
	//assert(top.size() == x);
	for(int i = L; i <= R; i++)
		q[top[i-L]] = i;
	cout << "query" << flush;
	for(int i = 1; i <= n; i++) cout << " " << q[i];
	cout << endl;
	int res;
	//res = (q[2] < q[1]) && (q[3] < q[4]);
	cin >> res;
	//debug(res);
	return res;
}

int g[N][N];

int mx[N], mn[N];
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> p[i];
		ind[p[i]] = i;
	}
	for(int i = 2; i <= n; i++){
		for(int j = i - 1; j > 0; j--){
			L = j;
			R = i;
			G[ind[i]].pb(ind[j]);
			int rs = Val(i);
			G[ind[i]].pop_back();
			if(!rs){
				//cerr << "!! " << ind[j] << " " << ind[i] << '\n';
				G[ind[j]].pb(ind[i]);			
			}
		}
	}
	for(int i = 1; i <= n; i++){
		for(auto x : G[i]) g[i][x] = 1;
	}
	top.clear();
	memset(mk,0,sizeof mk);
	cout << "end\n";
	for(int i = 1; i <= n; i++) if(!mk[i]) DFS(i);
	reverse(all(top));
	for(int i = 0 ; i < n; i++){
		for(int j = n - 2; j >= 0; j--){
			if(top[j] > top[j + 1]){
				if(!g[top[j]][top[j+1]]) swap(top[j], top[j + 1]);
			}
		}
	}
	for(int i = 0; i < n; i++) mn[top[i]] = i + 1;
	for(int i = 0 ; i < n; i++){
		for(int j = n - 2; j >= 0; j--){
			if(top[j] < top[j + 1]){
				if(!g[top[j]][top[j+1]]) swap(top[j], top[j + 1]);
			}
		}
	}
	for(int i = 0; i < n; i++) mx[top[i]] = i + 1;
	for(int i = 1; i <= n; i++) cout << mn[i] << " \n"[i==n];
	for(int i = 1; i <= n; i++) cout << mx[i] << " \n"[i==n];
	cout << flush;
	return 0;
}
/*
4
3 2 1 4


*/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 504 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 384 KB Output is correct
2 Incorrect 7 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 85 ms 416 KB Output isn't correct
2 Halted 0 ms 0 KB -