제출 #1362285

#제출 시각아이디문제언어결과실행 시간메모리
1362285blackscreen1Library (JOI18_library)C++20
100 / 100
51 ms520 KiB
#include <bits//stdc++.h>
#include "library.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_multiset;
#define ll long long
#define iloop(m, h) for (auto i = m; i != h; i += (m < h ? 1 : -1))
#define jloop(m, h) for (auto j = m; j != h; j += (m < h ? 1 : -1))
#define kloop(m, h) for (auto k = m; k != h; k += (m < h ? 1 : -1))
#define lloop(m, h) for (auto l = m; l != h; l += (m < h ? 1 : -1))
#define pll pair<ll, ll>
#define INF 1000000000000000
#define MOD1 1000000007
#define MOD2 998244353
#define MOD3 1000000009
ll n, cs[1005], res[2];
vector<int> v, adj[1005];
void dnc(ll lb, ll ub, ll ad, ll t) {
	if (lb == ub) {
		if (t == 2) res[0] = res[1] = lb;
		else res[t] = lb; 
		return;
	}
	ll mid = (lb + ub)>>1;
	vector<int> v2;
	iloop(0, n) v2.push_back(0);
	iloop(0, mid+1) v2[i] = 1;
	v2[ad] = 1;
	ll tr = Query(v2);
	if (t == 0) {
		if (tr == cs[mid]) ub = mid;
		else lb = mid + 1;
		dnc(lb, ub, ad, t);
		return;
	}
	if (t == 1) {
		if (tr == cs[mid] - 1) ub = mid;
		else lb = mid + 1;
		dnc(lb, ub, ad, t);
		return;
	}
	if (tr == cs[mid]) {
		dnc(lb, mid, ad, 0);
		dnc(mid+1, ub, ad, 1);
		return;
	}
	if (tr == cs[mid] - 1) dnc(lb, mid, ad, 2);
	else dnc(mid+1, ub, ad, 2);
}
void Solve(int N) {
	n = N;
	//cout << n << endl;
	v.clear();
	iloop(0, n) v.push_back(0);
	iloop(0, n) {
		v[i] = 1;
		cs[i] = Query(v);
		if (i && cs[i] < cs[i-1] + 1) {
			dnc(0, i-1, i, (cs[i] == cs[i-1] ? 0 : 2));
			if (cs[i] == cs[i-1]) {
				adj[i].push_back(res[0]);
				adj[res[0]].push_back(i);
			}
			else {
				adj[i].push_back(res[0]);
				adj[res[0]].push_back(i);
				adj[i].push_back(res[1]);
				adj[res[1]].push_back(i);
			}
		}
	}
	ll ej = 0;
	iloop(0, n) if ((ll)adj[i].size() == 1) {ej = i; break;}
	vector<int> ans;
	ans.push_back(ej+1);
	bool vis[n];
	memset(vis, 0, sizeof(vis));
	vis[ej] = 1;
	iloop(0, n-1) {
		for (auto it : adj[ej]) if (!vis[it]) {ej = it; break;}
		ans.push_back(ej+1);
		vis[ej] = 1;
	}
	//cout << "cao " << ans.size() << endl;
	//for (auto it : ans) cout << it << " ";
	Answer(ans);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…