답안 #828772

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
828772 2023-08-17T15:50:01 Z QwertyPi Inside information (BOI21_servers) C++14
0 / 100
186 ms 7260 KB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1.2e5 + 11;
const int LGN = 17;
vector<pair<int, int>> G[MAXN];
int isq[MAXN * 2], ans[MAXN * 2];

void share(int a, int b, int t){
	G[a].push_back({b, t});
	G[b].push_back({a, t});
}

int p[MAXN], anc[LGN][MAXN];
bool _inc[LGN][MAXN], _dec[LGN][MAXN];
int _max[LGN][MAXN], _min[LGN][MAXN];
int c[MAXN], dep[MAXN];

void dfs(int v, int pa = -1){
	if(pa == -1){
		p[v] = anc[0][v] = v; for(int j = 1; j < LGN; j++) anc[j][v] = v;
	}
	for(auto [u, t] : G[v]){
		if(u != pa){
			p[u] = anc[0][u] = v; for(int j = 1; j < LGN; j++) anc[j][u] = anc[j - 1][anc[j - 1][u]]; 
			dep[u] = dep[v] + 1; _max[0][u] = _min[0][u] = t; _inc[0][u] = _dec[0][u] = true; c[u] = t;
			for(int j = 1; j < LGN; j++){
				_max[j][u] = max(_max[j - 1][u], _max[j - 1][anc[j - 1][u]]);
				_min[j][u] = min(_min[j - 1][u], _min[j - 1][anc[j - 1][u]]);
				_inc[j][u] = _inc[j - 1][u] && _inc[j - 1][anc[j - 1][u]] && _max[j - 1][u] <= _min[j - 1][anc[j - 1][u]];
				_dec[j][u] = _dec[j - 1][u] && _dec[j - 1][anc[j - 1][u]] && _min[j - 1][u] >= _max[j - 1][anc[j - 1][u]];
			}
			dfs(u, v);
		}
	}
}
int kth_anc(int u, int k){
	for(int j = LGN - 1; j >= 0; j--){
		if(k & (1 << j)) u = anc[j][u];
	}
	return u;
}
int lca(int u, int v){
	if(dep[u] < dep[v]) swap(u, v);
	u = kth_anc(u, dep[u] - dep[v]);
	for(int j = LGN - 1; j >= 0; j--){
		if(anc[j][u] != anc[j][v])
			u = anc[j][u], v = anc[j][v];
	}
	return u == v ? u : p[u];
}

bool is_inc(int u, int l){
	int diff = dep[u] - dep[l];
	int d = __lg(diff);
	return _inc[d][u] && _inc[d][kth_anc(u, diff - (1 << d))];
}

bool is_dec(int u, int l){
	int diff = dep[u] - dep[l];
	int d = __lg(diff);
	return _dec[d][u] && _dec[d][kth_anc(u, diff - (1 << d))];
}

struct query_1{
	int a, d, t;
};

struct query_2{
	int d, t;
};

vector<query_1> Q1;
vector<query_2> Q2;

void query(int a, int d, int t){
	Q1.push_back({a, d, t});
}

void count(int d, int t){
	Q2.push_back({d, t});
}

int32_t main(){
	int n, k; cin >> n >> k;
	for(int t = 0; t < n + k - 1; t++){
		char c; cin >> c;
		if(c == 'S'){
			int a, b; cin >> a >> b;
			share(a, b, t);
		}else if(c == 'Q'){
			int a, d; cin >> a >> d;
			query(a, d, t);
			isq[t] = 1;
		}else{
			int d; cin >> d;
			count(d, t);
			isq[t] = 2;
		}
	}

	dfs(1);
	for(auto [a, d, t] : Q1){
		if(a == d){
			ans[t] = true;
			continue;
		}
		int l = lca(a, d);
		ans[t] = true;
		if(l == a){
			ans[t] = is_inc(d, l);
			ans[t] &= c[kth_anc(d, dep[a] - dep[d] - 1)] <= t;
		}else if(l == d){
			ans[t] = is_dec(a, l);
			ans[t] &= c[a] <= t;
		}else{
			ans[t] = is_inc(d, l);
			ans[t] &= is_dec(a, l);
			ans[t] &= c[kth_anc(a, dep[a] - dep[l] - 1)] >= c[kth_anc(d, dep[d] - dep[l] - 1)];
			ans[t] &= c[a] <= t;
		}
	}

	for(int t = 0; t < n + k - 1; t++){
		if(isq[t] == 1){
			cout << (ans[t] ? "yes" : "no") << endl;
		}else if(isq[t] == 2){
			cout << ans[t] << endl;
		}
	}
}

Compilation message

servers.cpp: In function 'void dfs(int, int)':
servers.cpp:24:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   24 |  for(auto [u, t] : G[v]){
      |           ^
servers.cpp: In function 'int32_t main()':
servers.cpp:104:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  104 |  for(auto [a, d, t] : Q1){
      |           ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 178 ms 7228 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 178 ms 7228 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 167 ms 7192 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 167 ms 7192 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 160 ms 7200 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 160 ms 7200 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 186 ms 7180 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 186 ms 7180 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 162 ms 7260 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 162 ms 7260 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 166 ms 7176 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 166 ms 7176 KB Output isn't correct
2 Halted 0 ms 0 KB -