結果
| 問題 |
No.363 門松サイクル
|
| コンテスト | |
| ユーザー |
koyumeishi
|
| 提出日時 | 2016-03-23 23:20:33 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,022 bytes |
| コンパイル時間 | 1,016 ms |
| コンパイル使用メモリ | 101,844 KB |
| 実行使用メモリ | 40,716 KB |
| 最終ジャッジ日時 | 2024-10-01 21:40:38 |
| 合計ジャッジ時間 | 12,207 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 1 WA * 26 |
ソースコード
#include <iostream>
#include <vector>
#include <cstdio>
#include <sstream>
#include <map>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
#include <functional>
#include <set>
#include <ctime>
#include <random>
#include <chrono>
using namespace std;
template<class T> istream& operator >> (istream& is, vector<T>& vec){for(T& val: vec) is >> val; return is;}
template<class T> istream& operator , (istream& is, T& val){ return is >> val;}
template<class T> ostream& operator << (ostream& os, const vector<T>& vec){for(int i=0; i<vec.size(); i++) os << vec[i] << (i==vec.size()-1?"":" "); return os;}
template<class T> ostream& operator , (ostream& os, const T& val){ return os << " " << val;}
template<class T> ostream& operator >> (ostream& os, const T& val){ return os << " " << val;}
bool is_kadomatsu(int a, int b, int c){
return a!=c && ((a<b&&b>c) || (a>b&&b<c));
}
int main(){
int n;
cin >> n;
vector<int> a(n);
cin >> a;
vector<vector<int>> G(n);
for(int i=0; i<n-1; i++){
int u,v;
cin >> u,v;
u--; v--;
G[u].push_back(v);
G[v].push_back(u);
}
vector<vector<int>> par(n, vector<int>(20));
vector<vector<int>> kad(n, vector<int>(20));
vector<int> dep(n, -1);
function<void(int,int)> dfs = [&](int pos, int last){
dep[pos] = dep[last]+1;
par[pos][0] = last;
if(is_kadomatsu(a[pos], a[last], a[par[last][0]])){
kad[pos][0] = 1;
}else{
kad[pos][0] = 0;
}
for(int next : G[pos]){
if(next == last) continue;
dfs(next, pos);
}
};
dfs(0,0);
for(int k=1; k<20; k++){
for(int i=0; i<n; i++){
kad[i][k] = kad[i][k-1] & kad[par[i][k-1]][k-1];
par[i][k] = par[par[i][k-1]][k-1];
}
}
auto k_anc = [&](int pos, int k){
int b=0;
while(k){
if(k&1) pos = par[pos][b];
b++;
k >>= 1;
}
return pos;
};
auto lca = [&](int u, int v){
if(dep[u] < dep[v]) swap(u,v);
u = k_anc(u, dep[u]-dep[v]);
for(int k=19; k>=0; k--){
if(par[u][k] != par[v][k]){
u = par[u][k];
v = par[v][k];
}
}
return par[u][0];
};
auto kadomatsu_line = [&](int u, int p) -> bool{
int d = dep[u] - dep[p] - 1;
if(d<0) return true;
int ret = kad[u][0];
int b = 0;
while(d>0){
if(d&1){
ret &= kad[u][b];
u = par[u][b];
}
b++;
d>>=1;
}
return ret;
};
int q;
cin >> q;
while(q--){
int u,v;
cin >> u,v;
u--; v--;
if(dep[u] < dep[v]) swap(u,v);
int p = lca(u,v);
if(p==v){
int pu = k_anc(u, dep[u]-dep[p]-1);
int qu = par[u][0];
bool ok = (
is_kadomatsu(a[pu],a[p],a[u]) &&
is_kadomatsu(a[p],a[u],a[qu]) &&
kadomatsu_line(u, p)
);
cout << (ok?"YES":"NO") << endl;
}else{
int pu = k_anc(u, dep[u]-dep[p]-1);
int pv = k_anc(v, dep[v]-dep[p]-1);
int qu = par[u][0];
int qv = par[v][0];
bool ok = (
is_kadomatsu(a[pu], a[p], a[pv]) &&
is_kadomatsu(a[qu], a[u], a[v]) &&
is_kadomatsu(a[u], a[v], a[qv]) &&
kadomatsu_line(u,p) &&
kadomatsu_line(v,p)
);
cout << (ok?"YES":"NO") << endl;
}
}
return 0;
}
koyumeishi