답안 #365452

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
365452 2021-02-11T17:15:09 Z kostia244 popa (BOI18_popa) C++17
0 / 100
19 ms 492 KB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2")
#ifdef EVAL
#include"popa.h"
#endif
#include<bits/stdc++.h>
#define all(x) begin(x), end(x)
using namespace std;
using ll = long long;
 
namespace local {
	int ar[10010], qc = 0;
	int query(int a, int b, int c, int d) {
		qc++;
		int x = 0, y = 0;
		for(;a<=b;a++) x = __gcd(x, ar[a]);
		for(;c<=d;c++) y = __gcd(y, ar[c]);
		return x==y;
	}
};
#ifndef EVAL
using namespace local;
#endif

int nnn;
int q69(int a, int b, int c, int d) {
	if(min(a, c) < 0 || max(b, d) >= nnn || a > b || c > d) exit(7);
	return query(a, b, c, d);
}

int vis = 0, ok = 1;
void dfs(int v, int *L, int *R) {
	if(L[v] != -1) {
#ifndef EVAL
		ok &= ar[L[v]]%ar[v] == 0;
#endif
		dfs(L[v], L, R);
	}
	ok &= vis == v;
	//cout << v << " ";
	vis++;
	if(R[v] != -1) {
#ifndef EVAL
		ok &= ar[R[v]]%ar[v] == 0;
#endif
		dfs(R[v], L, R);
	}
}
#define query q69
int solve(int n, int *L, int *R) {
	for(int i = 0; i < n; i++) L[i] = R[i] = -1;
	nnn = n;
	vector<int> st {0};
	int rt = 0;
	vector<int> start(n);
	for(int i = 1; i < n; i++) {
		int ins = 0;
		while(st.size()) {
			int v = st.back();
			if(R[v] == -1) {//try becoming right child
				if(query(start[v], i, v, v)) {//possible
					R[v] = i;
					start[i] = i;
					ins = 1;break;
				} else {
					st.pop_back();
				}
			} else {//try putting right child as my left child
				int vr = R[v];
				if(query(start[vr], i, i, i)) {
					R[v] = i;
					L[i] = vr;
					start[i] = start[vr];
					ins = 1;break;
				} else {
					st.pop_back();
				}
			}
		}
		if(!ins) {
			L[i] = rt;
			start[i] = 0;
			rt = i;
		}
		st.push_back(i);
		//for(auto i : st) cout << i << " "; cout << "x" << endl;
	}
	exit(3);
	return rt;
}

#ifndef EVAL
int main() {
	cin.tie(0)->sync_with_stdio(0);
	//multitest([&](){});
	int n;
	cin >> n;
	for(int i = 0; i < n; i++) cin >> ar[i];
	vector<int> L(n), R(n);
	int rt =  solve(n, L.data(), R.data());
	cout << rt << endl;
	for(int i = 0; i < n; i++) cout << L[i] << " " << R[i] << '\n';
	cout << " :: " << qc << endl;
	dfs(rt, L.data(), R.data());
	ok &= vis == n;cout << endl;
	cout << "status: " << ok << endl;
}
#endif
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 364 KB Execution failed because the return code was nonzero
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 19 ms 364 KB Execution failed because the return code was nonzero
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 17 ms 492 KB Execution failed because the return code was nonzero
2 Halted 0 ms 0 KB -