답안 #504034

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
504034 2022-01-09T14:39:17 Z AriaH 도서관 (JOI18_library) C++17
0 / 100
56 ms 48008 KB
/** I can do this all day **/

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#include "library.h"

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair < int, int > pii;
typedef pair < ll, ll > pll;

#define F first
#define S second
#define all(x) x.begin(), x.end()
#define SZ(x) (int)x.size()
#define Mp make_pair
#define endl "\n"
#define fast_io ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define file_io freopen("inupt.txt", "r+", stdin); freopen("output.txt", "w+", stdout);

const int N = 1e6 + 10;
const ll mod = 1e9 + 7;
const ll inf = 8e18;
const int LOG = 20;

ll pw(ll a, ll b, ll M, ll ret = 1) { if(a == 0) return 0; a %= M; while(b) { ret = (b & 1? ret * a % M : ret), a = a * a % M, b >>= 1; } return ret % M; }

int n;

vector < int > Q, G[N];

vector < pii > E;

/*
int Query(vector < int > vec)
{
	printf("query : \n");
	for(int i = 0; i < n; i ++)
	{
		printf("%d ", vec[i]);
	}
	int x;
	scanf("%d", &x);
	return x;
}

void Answer(vector < int > vec)
{
	printf("ans : \n");
	for(auto x : vec) printf("%d ", x);
	printf("\n");
}*/

void add(int a, int b)
{
	a ++, b ++;
	///printf("finde %d %d\n", a, b);
	G[a].push_back(b);
	G[b].push_back(a);
	E.push_back({a - 1, b - 1});
}

void Fill(int l, int r)
{
	for(int i = 0; i < l; i ++) Q[i] = 0;
	for(int i = r + 1; i < n; i ++) Q[i] = 0;
	for(int i = l; i <= r; i ++) Q[i] = 1;
}

int yal()
{
	int T = 0;
	for(int i = 0; i < n; i ++)
	{
		T += Q[i];
	}
	if(T <= 1) return 0;
	int cu = T - Query(Q);
	for(auto [a, b] : E)
	{
		if(Q[a] && Q[b]) cu --;
	}
	return cu;
}

inline int ask(int i, int l, int r)
{
	if(l > r || i >= l) return 0;
	Fill(l, r);
	int cu = yal();
	Q[i] = 1;
	int cu2 = yal();
	return cu2 - cu; 
}

void Solve(int _n)
{
	if(n == 1)
	{
		Answer({1});
	}
	n = _n;
	Q.resize(n, 0);
	E.clear();
	for(int i = 0; i < n; i ++) G[i].clear();
	for(int i = 0; i < n - 1; i ++)
	{
		int e = ask(i, i + 1, n - 1);
		///printf("i = %d e = %d\n", i, e);
		while(e --)
		{
			int d = i, up = n - 1;
			while(up - d > 1)
			{
				int mid = (up + d) >> 1;
				if(ask(i, i + 1, mid))
				{
					up = mid;
				}
				else
				{
					d = mid;
				}
			}
			add(i, up);
		}
	}
	int st = -1, last = 0;
	for(int i = 1; i <= n; i ++) if(SZ(G[i]) == 1) st = i;
	vector < int > Ans;
	assert(st != -1);
	while(1)
	{
		int nxt = 0;
		Ans.push_back(st);
		for(auto now : G[st]) nxt ^= now;
		nxt ^= last;
		last = st;
		st = nxt;
		if(st == 0) break;
	}
	Answer(Ans);
}
/*
int main()
{
	scanf("%d", &n);
	Solve(n);

	return 0;
}
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 23776 KB # of queries: 3041
2 Correct 48 ms 23764 KB # of queries: 2995
3 Correct 56 ms 23752 KB # of queries: 3186
4 Correct 43 ms 23752 KB # of queries: 3170
5 Correct 56 ms 23764 KB # of queries: 3171
6 Correct 55 ms 23728 KB # of queries: 3141
7 Correct 56 ms 23764 KB # of queries: 3170
8 Correct 47 ms 23716 KB # of queries: 3028
9 Correct 49 ms 23780 KB # of queries: 3190
10 Correct 40 ms 23752 KB # of queries: 1872
11 Runtime error 30 ms 48008 KB Execution killed with signal 6
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 23776 KB # of queries: 3041
2 Correct 48 ms 23764 KB # of queries: 2995
3 Correct 56 ms 23752 KB # of queries: 3186
4 Correct 43 ms 23752 KB # of queries: 3170
5 Correct 56 ms 23764 KB # of queries: 3171
6 Correct 55 ms 23728 KB # of queries: 3141
7 Correct 56 ms 23764 KB # of queries: 3170
8 Correct 47 ms 23716 KB # of queries: 3028
9 Correct 49 ms 23780 KB # of queries: 3190
10 Correct 40 ms 23752 KB # of queries: 1872
11 Runtime error 30 ms 48008 KB Execution killed with signal 6
12 Halted 0 ms 0 KB -