Submission #1555796
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
#define GET_MACRO(_1, _2, _3, NAME, ...) NAME
#define _repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define _rep(i,n) _repl(i,0,n)
#define rep(...) GET_MACRO(__VA_ARGS__, _repl, _rep)(__VA_ARGS__)
#define mp(a,b) make_pair((a),(b))
#define pb(a) push_back((a))
#define all(x) (x).begin(),(x).end()
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
void _dbg(string){cout<<endl;}
template<class H,class... T> void _dbg(string s,H h,T... t){int l=s.find(',');cout<<s.substr(0,l)<<" = "<<h<<", ";_dbg(s.substr(l+1),t...);}
template<class T,class U> ostream& operator<<(ostream &o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream &o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}
#define INF 1000000005
#define N 100005
int n;
int num[N];
int ans[N], lf[N], ri[N];
vector<int> arr;
vector<int> tree[N];
//seg tree data
multiset<int> data[1<<18];
int sz;
void tour(int v){
lf[v] = arr.size();
arr.pb(num[v]);
for(auto to : tree[v]) tour(to);
ri[v] = arr.size();
}
inline void del(int x, int p){
x += sz-1;
data[x].erase(data[x].lower_bound(p));
while(x>0){
x = (x-1)/2;
data[x].erase(data[x].lower_bound(p));
}
}
inline void ins(int x, int p){
x += sz-1;
data[x].insert(p);
while(x>0){
x = (x-1)/2;
data[x].insert(p);
}
}
inline void upd(int &l, const int r, const int x){
int dl = abs(l-x), dr=abs(r-x);
if(dl==dr && r<l) l = r;
if(dl > dr) l = r;
}
int query(int a, int b, int x, int k, int l, int r){
if(r<=a || b<=l) return -INF;
if(a<=l && r<=b){
auto itr = data[k].lower_bound(x);
int ret = -INF;
if(itr != data[k].end()) upd(ret, *itr, x);
if(itr != data[k].begin()) upd(ret, *(--itr), x);
return ret;
}
int vl = query(a,b,x,k*2+1,l,(r+l)/2);
int vr = query(a,b,x,k*2+2,(r+l)/2,r);
int ret = -INF;
upd(ret, vl, x);
upd(ret, vr, x);
return ret;
}
inline int query(int a, int b, int x){
return query(a,b,x,0,0,sz);
}
void dfs(int v){
int x = num[v];
int v1 = query(0, lf[v], x);
int v2 = query(ri[v], n, x);
ans[v] = -INF;
upd(ans[v], v1, x);
upd(ans[v], v2, x);
if(tree[v].size()>0){
del(lf[v], x);
for(auto to : tree[v]) dfs(to);
ins(lf[v], x);
}
}
int main(){
cin>>n;
vector<int> par(n, -1);
rep(i,n) cin>>num[i];
rep(i,n-1){
int a,b;
cin>>a>>b;
tree[a].pb(b);
par[b] = a;
}
int root = -1;
rep(i,n) if(par[i] == -1) root = i;
tour(root);
sz=1;
while(sz<n) sz*=2;
rep(i,n) data[i+sz-1].insert(arr[i]);
for(int i=sz-2; i>=0; i--){
data[i] = data[2*i+1];
for(auto x : data[2*i+2]) data[i].insert(x);
}
dfs(root);
rep(i,n) if(ans[i]==2*INF || ans[i]==-INF) ans[i] = -1;
rep(i,n) cout << ans[i] << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
I - 支配と友好 |
User |
tossy |
Language |
C++14 (GCC 5.4.1) |
Score |
200 |
Code Size |
3062 Byte |
Status |
AC |
Exec Time |
1368 ms |
Memory |
111224 KB |
Judge Result
Set Name |
All |
Score / Max Score |
200 / 200 |
Status |
|
Set Name |
Test Cases |
All |
sample01, sample02, sample03, binary00, binary01, binary02, binary03, hand00, line00, line01, line02, random00, random01, random02, random03, random04, random05, random06, random07, random08, sample01, sample02, sample03, star00, star01, star02, ternary00, ternary01, ternary02, ternary03, thin00, thin01, thin02, thin03, thin04, thin05, thin06, thin07, uniform00, uniform01, uniform02, uniform03, uniform04, uniform05, uniform06 |
Case Name |
Status |
Exec Time |
Memory |
binary00 |
AC |
1368 ms |
103416 KB |
binary01 |
AC |
1227 ms |
103672 KB |
binary02 |
AC |
1216 ms |
103928 KB |
binary03 |
AC |
1211 ms |
104056 KB |
hand00 |
AC |
860 ms |
108660 KB |
line00 |
AC |
1165 ms |
111224 KB |
line01 |
AC |
1137 ms |
111224 KB |
line02 |
AC |
1144 ms |
111224 KB |
random00 |
AC |
1226 ms |
103420 KB |
random01 |
AC |
1362 ms |
103548 KB |
random02 |
AC |
1266 ms |
103548 KB |
random03 |
AC |
1215 ms |
103676 KB |
random04 |
AC |
1196 ms |
103800 KB |
random05 |
AC |
1194 ms |
103932 KB |
random06 |
AC |
1192 ms |
103932 KB |
random07 |
AC |
1199 ms |
104060 KB |
random08 |
AC |
1196 ms |
104184 KB |
sample01 |
AC |
6 ms |
14848 KB |
sample02 |
AC |
6 ms |
14848 KB |
sample03 |
AC |
6 ms |
14848 KB |
star00 |
AC |
743 ms |
102264 KB |
star01 |
AC |
748 ms |
102520 KB |
star02 |
AC |
760 ms |
102904 KB |
ternary00 |
AC |
1189 ms |
102904 KB |
ternary01 |
AC |
1089 ms |
103160 KB |
ternary02 |
AC |
1057 ms |
103416 KB |
ternary03 |
AC |
1063 ms |
103544 KB |
thin00 |
AC |
1236 ms |
106616 KB |
thin01 |
AC |
1125 ms |
104952 KB |
thin02 |
AC |
1220 ms |
106744 KB |
thin03 |
AC |
1104 ms |
105208 KB |
thin04 |
AC |
1207 ms |
107000 KB |
thin05 |
AC |
1093 ms |
105464 KB |
thin06 |
AC |
1214 ms |
107256 KB |
thin07 |
AC |
1106 ms |
105720 KB |
uniform00 |
AC |
989 ms |
103288 KB |
uniform01 |
AC |
950 ms |
103672 KB |
uniform02 |
AC |
860 ms |
105072 KB |
uniform03 |
AC |
858 ms |
103292 KB |
uniform04 |
AC |
824 ms |
103160 KB |
uniform05 |
AC |
810 ms |
103036 KB |
uniform06 |
AC |
788 ms |
102912 KB |