답안 #857092

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
857092 2023-10-05T11:25:58 Z jmyszka2007 Cat Exercise (JOI23_ho_t4) C++17
54 / 100
2000 ms 82624 KB
#include <bits/stdc++.h>
#include <fstream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
template<class A, class B>
ostream& operator<<(ostream& o, const pair<A, B>& p) {return o << '(' << p.first << ", " << p.second << ')';}
template<size_t Index = 0, typename... Types>
ostream& printTupleElements(ostream& o, const tuple<Types...>& t) {if constexpr (Index < sizeof...(Types)){if(Index > 0){o << ", ";}o << get<Index>(t);printTupleElements<Index + 1>(o, t);}return o;}
template<typename... Types>
ostream& operator<<(ostream& o, const tuple<Types...>& t){o << "(";printTupleElements(o, t);return o << ")";}
template<class T>
auto operator<<(ostream& o, const T& x) -> decltype(x.end(), o){o << '{';bool first = true;for (const auto& e : x){if (!first){o << ", ";}o << e;first = false;} return o << '}';}
#define DEBUG
#ifdef DEBUG
#define fastio()
#define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n'
#define check(x) if (!(x)) { cerr << "Check failed: " << #x << " in line " << __LINE__ << endl; exit(1); }
#else
#define fastio() ios_base::sync_with_stdio(0); cin.tie(0);
#define debug(...)
#define check(x) 
#endif
typedef long long ll;
#define pi pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define vi vector<int>
#define vll vector<ll>
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
constexpr int LIM = 2e5;
constexpr int base = (1 << 18);
int tri[2 * base];
int obc[2 * base];
vi g[LIM + 10];
int tab[LIM + 10];
ll dp[LIM + 10];
pi prep[LIM + 10];
int nxt[LIM + 10][19];
pi mx[LIM + 10][19];
int pre[LIM + 10];
int siz[LIM + 10];
int oj[LIM + 10];
int post[LIM + 10];
int aktpre = 1;
int aktpost = 1;
void cntsiz(int v, int o) {
	siz[v] = 1;
	for(auto x : g[v]) {
		if(x != o) {
			cntsiz(x, v);
			siz[v] += siz[x];
		}
	}
}
void makehld(int v, int o) {
	pi mx = {0, -1};
	for(int i = 0; i < sz(g[v]); i++) {
		if(g[v][i] != o) {
			mx = max(mx, make_pair(siz[g[v][i]], i));
		}
	}
	if(mx.nd >= 0) {
		swap(g[v][0], g[v][mx.nd]);
		oj[g[v][0]] = v;
		makehld(g[v][0], v);
		for(int i = 1; i < sz(g[v]); i++) {
			if(g[v][i] != o) {
				oj[g[v][i]] = g[v][i];
				makehld(g[v][i], v);
			}
		}
	}
}
void dfs(int v, int o) {
	pre[v] = aktpre++;
	nxt[v][0] = o;
	mx[v][0] = max(make_pair(tab[v], v), make_pair(tab[o], o));
	for(int i = 1; i <= 18; i++) {
		nxt[v][i] = nxt[nxt[v][i - 1]][i - 1];
		mx[v][i] = max(mx[v][i - 1], mx[nxt[v][i - 1]][i - 1]);
	}
	for(auto x : g[v]) {
		if(x != o) {
			dfs(x, v);
		}
	}
	post[v] = aktpost++;
}
bool czy(int a, int b) {
	return pre[a] <= pre[b] && post[a] >= post[b];
}
int dist(int v, int o) {
	if(v == o) {
		return 0;
	}
	if(pre[v] < pre[o]) {
		swap(v, o);
	}
	int ans = 0;
	for(int i = 18; i >= 0; i--) {
		if(!czy(nxt[v][i], o)) {
			ans += (1 << i);
			v = nxt[v][i];
		}
	}
	if(!czy(v, o)) {
		ans++;
		v = nxt[v][0];
	}
	for(int i = 18; i >= 0; i--) {
		if(!czy(nxt[o][i], v)) {
			ans += (1 << i);
			o = nxt[o][i];
		}
	}
	if(!czy(o, v)) {
		ans++;
		o = nxt[o][0];
	}
	return ans;
}
void update(int v, int l, int r, int a, int b, int x)  {
	if(l > b || r < a) {
		return;
	}
	if(a <= l && r <= b) {
		tri[v] = max(tri[v], x);
		obc[v] = max(obc[v], x);
		return;
	}
	int mid = (l + r) / 2;
	update(2 * v, l, mid, a, b, x);
	update(2 * v + 1, mid + 1, r, a, b, x);
	tri[v] = max(tri[v], max(tri[2 * v], tri[2 * v + 1]));
}
int query(int v, int l, int r, int a, int b)  {
	if(l > b || r < a) {
		return 0;
	}
	if(a <= l && r <= b) {
		return tri[v];
	}
	int mid = (l + r) / 2;
	return max({obc[v], query(2 * v, l, mid, a, b), query(2 * v + 1, mid + 1, r, a, b)});
}
void upd(int v, int o, int x) {
	while(pre[v] >= pre[o]) {
		if(pre[oj[v]] >= pre[o]) {
			update(1, 1, base, pre[oj[v]], pre[v], x);
			if(oj[v] == 1) {
				break;
			}
			v = nxt[oj[v]][0];
		}
		else {
			update(1, 1, base, pre[o], pre[v], x);
			break;
		}
	}
}
int que(int v, int o) {
	int ans = 0;
	while(pre[v] >= pre[o]) {
		if(pre[oj[v]] >= pre[o]) {
			ans = max(ans, query(1, 1, base, pre[oj[v]], pre[v]));
			if(oj[v] == 1) {
				break;
			}
			v = nxt[oj[v]][0];
		}
		else {
			ans = max(ans, query(1, 1, base, pre[o], pre[v]));
			break;
		}
	}
	return ans;
}
void solve() {
	//ifstream cin("nazwa.in");
	//ofstream cout("nazwa.out");
	int n;
	cin >> n;
	vector<pi>vs;
	vi pos(n + 1, 0);
	for(int i = 1; i <= n; i++) {
		cin >> tab[i];
		vs.eb(tab[i], i);
		pos[tab[i]] = i;
	}
	sort(all(vs));
	for(int i = 1; i < n; i++) {
		int a, b;
		cin >> a >> b;
		g[a].eb(b);
		g[b].eb(a);
	}
	cntsiz(1, 1);
	makehld(1, 1);
	dfs(1, 1);
	for(auto [val, v] : vs) {
		int a = nxt[v][0];
		pi mx2 = {tab[a], a};
		for(int i = 18; i >= 0; i--) {
			if(mx[a][i].st < val) {
				mx2 = max(mx2, mx[a][i]);
				a = nxt[a][i];
			}
		}
		//debug(v, a, que(v, a));
		if(tab[a] < val) {
			int kt = pos[que(v, a)];
			dp[v] = max(dp[v], dp[kt] + dist(v, kt));
			upd(v, a, tab[v]);
			a = nxt[a][0];
		}
		else {
			upd(v, v, tab[v]);
		}
		dp[a] = max(dp[a], dp[v] + dist(v, a));
		//debug(v, dp[v]);
		if(val == n) {
			cout << dp[v] << '\n';
			return;
		}
	}
}
int main() {
	fastio();
	int t = 1;
	//cin >> t;
	while(t--) {
		solve();
	}
}

# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 14680 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 2 ms 14684 KB Output is correct
4 Correct 2 ms 14684 KB Output is correct
5 Correct 2 ms 14684 KB Output is correct
6 Correct 2 ms 14684 KB Output is correct
7 Correct 2 ms 14684 KB Output is correct
8 Correct 2 ms 14684 KB Output is correct
9 Correct 2 ms 14684 KB Output is correct
10 Correct 3 ms 14684 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 14680 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 2 ms 14684 KB Output is correct
4 Correct 2 ms 14684 KB Output is correct
5 Correct 2 ms 14684 KB Output is correct
6 Correct 2 ms 14684 KB Output is correct
7 Correct 2 ms 14684 KB Output is correct
8 Correct 2 ms 14684 KB Output is correct
9 Correct 2 ms 14684 KB Output is correct
10 Correct 3 ms 14684 KB Output is correct
11 Correct 6 ms 14684 KB Output is correct
12 Correct 5 ms 14684 KB Output is correct
13 Correct 5 ms 14936 KB Output is correct
14 Correct 3 ms 14684 KB Output is correct
15 Correct 3 ms 14684 KB Output is correct
16 Correct 3 ms 14684 KB Output is correct
17 Correct 3 ms 14684 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 14680 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 2 ms 14684 KB Output is correct
4 Correct 2 ms 14684 KB Output is correct
5 Correct 2 ms 14684 KB Output is correct
6 Correct 2 ms 14684 KB Output is correct
7 Correct 2 ms 14684 KB Output is correct
8 Correct 2 ms 14684 KB Output is correct
9 Correct 2 ms 14684 KB Output is correct
10 Correct 3 ms 14684 KB Output is correct
11 Correct 6 ms 14684 KB Output is correct
12 Correct 5 ms 14684 KB Output is correct
13 Correct 5 ms 14936 KB Output is correct
14 Correct 3 ms 14684 KB Output is correct
15 Correct 3 ms 14684 KB Output is correct
16 Correct 3 ms 14684 KB Output is correct
17 Correct 3 ms 14684 KB Output is correct
18 Correct 895 ms 17820 KB Output is correct
19 Correct 792 ms 17588 KB Output is correct
20 Correct 795 ms 17748 KB Output is correct
21 Correct 14 ms 17496 KB Output is correct
22 Correct 13 ms 17500 KB Output is correct
23 Correct 14 ms 17500 KB Output is correct
24 Correct 13 ms 17500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 14680 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 2 ms 14684 KB Output is correct
4 Correct 2 ms 14684 KB Output is correct
5 Correct 2 ms 14684 KB Output is correct
6 Correct 2 ms 14684 KB Output is correct
7 Correct 2 ms 14684 KB Output is correct
8 Correct 2 ms 14684 KB Output is correct
9 Correct 2 ms 14684 KB Output is correct
10 Correct 3 ms 14684 KB Output is correct
11 Correct 6 ms 14684 KB Output is correct
12 Correct 5 ms 14684 KB Output is correct
13 Correct 5 ms 14936 KB Output is correct
14 Correct 3 ms 14684 KB Output is correct
15 Correct 3 ms 14684 KB Output is correct
16 Correct 3 ms 14684 KB Output is correct
17 Correct 3 ms 14684 KB Output is correct
18 Correct 895 ms 17820 KB Output is correct
19 Correct 792 ms 17588 KB Output is correct
20 Correct 795 ms 17748 KB Output is correct
21 Correct 14 ms 17496 KB Output is correct
22 Correct 13 ms 17500 KB Output is correct
23 Correct 14 ms 17500 KB Output is correct
24 Correct 13 ms 17500 KB Output is correct
25 Correct 2 ms 14684 KB Output is correct
26 Correct 464 ms 17660 KB Output is correct
27 Correct 487 ms 17496 KB Output is correct
28 Correct 486 ms 17392 KB Output is correct
29 Correct 495 ms 17496 KB Output is correct
30 Correct 11 ms 16988 KB Output is correct
31 Correct 11 ms 17244 KB Output is correct
32 Correct 11 ms 16984 KB Output is correct
33 Correct 12 ms 16984 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 14680 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 2 ms 14684 KB Output is correct
4 Correct 2 ms 14684 KB Output is correct
5 Correct 2 ms 14684 KB Output is correct
6 Correct 2 ms 14684 KB Output is correct
7 Correct 2 ms 14684 KB Output is correct
8 Correct 2 ms 14684 KB Output is correct
9 Correct 2 ms 14684 KB Output is correct
10 Correct 3 ms 14684 KB Output is correct
11 Correct 6 ms 14684 KB Output is correct
12 Correct 5 ms 14684 KB Output is correct
13 Correct 5 ms 14936 KB Output is correct
14 Correct 3 ms 14684 KB Output is correct
15 Correct 3 ms 14684 KB Output is correct
16 Correct 3 ms 14684 KB Output is correct
17 Correct 3 ms 14684 KB Output is correct
18 Correct 895 ms 17820 KB Output is correct
19 Correct 792 ms 17588 KB Output is correct
20 Correct 795 ms 17748 KB Output is correct
21 Correct 14 ms 17496 KB Output is correct
22 Correct 13 ms 17500 KB Output is correct
23 Correct 14 ms 17500 KB Output is correct
24 Correct 13 ms 17500 KB Output is correct
25 Execution timed out 2020 ms 82624 KB Time limit exceeded
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 14680 KB Output is correct
2 Correct 2 ms 14936 KB Output is correct
3 Correct 474 ms 68936 KB Output is correct
4 Correct 457 ms 68804 KB Output is correct
5 Correct 459 ms 68816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 14680 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 2 ms 14684 KB Output is correct
4 Correct 2 ms 14684 KB Output is correct
5 Correct 2 ms 14684 KB Output is correct
6 Correct 2 ms 14684 KB Output is correct
7 Correct 2 ms 14684 KB Output is correct
8 Correct 2 ms 14684 KB Output is correct
9 Correct 2 ms 14684 KB Output is correct
10 Correct 3 ms 14684 KB Output is correct
11 Correct 6 ms 14684 KB Output is correct
12 Correct 5 ms 14684 KB Output is correct
13 Correct 5 ms 14936 KB Output is correct
14 Correct 3 ms 14684 KB Output is correct
15 Correct 3 ms 14684 KB Output is correct
16 Correct 3 ms 14684 KB Output is correct
17 Correct 3 ms 14684 KB Output is correct
18 Correct 895 ms 17820 KB Output is correct
19 Correct 792 ms 17588 KB Output is correct
20 Correct 795 ms 17748 KB Output is correct
21 Correct 14 ms 17496 KB Output is correct
22 Correct 13 ms 17500 KB Output is correct
23 Correct 14 ms 17500 KB Output is correct
24 Correct 13 ms 17500 KB Output is correct
25 Correct 2 ms 14684 KB Output is correct
26 Correct 464 ms 17660 KB Output is correct
27 Correct 487 ms 17496 KB Output is correct
28 Correct 486 ms 17392 KB Output is correct
29 Correct 495 ms 17496 KB Output is correct
30 Correct 11 ms 16988 KB Output is correct
31 Correct 11 ms 17244 KB Output is correct
32 Correct 11 ms 16984 KB Output is correct
33 Correct 12 ms 16984 KB Output is correct
34 Execution timed out 2020 ms 82624 KB Time limit exceeded
35 Halted 0 ms 0 KB -