제출 #1360810

#제출 시각아이디문제언어결과실행 시간메모리
1360810AMel0n늑대인간 (IOI18_werewolf)C++20
0 / 100
688 ms589824 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;

vector<int> mn, mx;
void build(int tl, int tr, int i, vector<int> &V) {
	if (tl == tr) {
		mn[i] = mx[i] = V[tl];
		return ;
	}
	int tm = (tl + tr) / 2;
	build(tl, tm, i * 2, V);
	build(tm + 1, tr, i * 2 + 1, V);
	mn[i] = min(mn[i * 2], mn[i * 2 + 1]);
	mx[i] = max(mx[i * 2], mx[i * 2 + 1]);
}
int query(int t, int ql, int qr, int tl, int tr, int i) {
	if (ql > qr) {
		if (t) return -INF; 
		else return INF;
	}
	if (ql == tl && qr == tr) {
		if (t) return mx[i];
		else return mn[i];
	}
	int tm = (tl + tr) / 2;
	if (t) return max(query(t, ql, min(qr, tm), tl, tm, i * 2), query(t, max(ql, tm + 1), qr, tm + 1, tr, i * 2 + 1));
	return min(query(t, ql, min(qr, tm), tl, tm, i * 2), query(t, max(ql, tm + 1), qr, tm + 1, tr, i * 2 + 1));

}

vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
	// furthest T from S such that [S, T] has no i < L
	// after transforming at T, is there a city i in [T, E] where i > R
	int Q = S.size();
	vector<int> A(Q);
	vector<int> V(N), P(N, -1); // V[i] = population, P[pop] = i
	vector<vector<int>> adj(N);
	for(int i = 0; i < N-1; i++) {
		adj[X[i]].push_back(Y[i]), adj[Y[i]].push_back(X[i]);
	}
	int root; for(int i = 0; i < N; i++) if (adj[i].size() == 1) root = i;
	int cur = root, cnt = 0;
	while(true) {
		P[cur] = cnt;
		V[cnt++] = cur;
		if (P[adj[cur][0]] == -1) cur = adj[cur][0];
		else if (P[adj[cur][1]] == -1) cur = adj[cur][1];
		else break;
	}
	mn.resize(N*4), mx.resize(N*4);
	build(0, N-1, 1, V);
	for(int q = 0; q < Q; q++) {
		int s = S[q], e = E[q];
		if (e < s) {
			int l = e, r = s+1;
			while(l < r) {
				int m = (l + r) / 2;
				if (query(0, m, s, 0, N-1, 1) >= L[q]) r = m;
				else l = m + 1;
			}
			A[q] = query(1, e, l, 0, N-1, 1) <= R[q];
		} else {
			int l = s, r = e+1;
			while(l < r - 1) {
				int m = (l + r) / 2;
				if (query(0, s, m, 0, N-1, 1) >= L[q]) l = m;
				else r = m;
			}
			A[q] = query(1, l, e, 0, N-1, 1) <= R[q];
		}
	}
	return A;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…