답안 #525858

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
525858 2022-02-13T03:58:54 Z koioi.org-koosaga Mountains and Valleys (CCO20_day1problem3) C++17
3 / 25
737 ms 25436 KB
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
using namespace std;
typedef long long lint;
typedef pair<lint, lint> pi;
const int MAXN = 500005;

struct edge{
	int s, e, x;
};

int n, m;
vector<int> gph[MAXN];
int par[20][MAXN], dep[MAXN];

int lca(int x, int y){
	if(dep[x] > dep[y]) swap(x, y);
	int dx = dep[y] - dep[x];
	for(int i = 0; dx; i++){
		if(dx & 1) y = par[i][y];
		dx >>= 1;
	}
	for(int i = 19; i >= 0; i--){
		if(par[i][x] != par[i][y]){
			x = par[i][x];
			y = par[i][y];
		}
	}
	if(x != y) return par[0][x];
	return x;
}

vector<int> ord;
int din[MAXN], dout[MAXN], piv;
int f[MAXN], far[MAXN], diam[MAXN], pfar[MAXN];
vector<pi> fars[MAXN];

bool in(int u, int v){
	return din[u] <= din[v] && dout[v] <= dout[u];
}

void dfs(int x, int p = -1){
	ord.push_back(x);
	din[x] = ++piv;
	for(auto &y : gph[x]){
		if(y == p) continue;
		par[0][y] = x;
		dep[y] = dep[x] + 1;
		dfs(y, x);
	}
	dout[x] = piv;
}

bool vis[MAXN];

pi dfsl(int x, int p = -1){
	pi ret(0, x);
	for(auto &y : gph[x]){
		if(y == p || vis[y]) continue;
		auto ans = dfsl(y, x);
		ans.first++;
		ret = max(ret, ans);
	}
	return ret;
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	vector<edge> qry;
	for(int i = 0; i < m; i++){
		int s, e, x; cin >> s >> e >> x;
		if(x == 1){
			gph[s].push_back(e);
			gph[e].push_back(s);
		}
		else{
			qry.push_back({s, e, x});
		}
	}
	dfs(0);
	for(int i = 1; i < 20; i++){
		for(int j = 0; j < n; j++){
			par[i][j] = par[i-1][par[i-1][j]];
		}
	}
	{
		for(int i = 0; i < n; i++){
			if(dep[i] >= 2){
				vis[i] = 1;
				vis[par[1][i]] = 1;
				f[i] = dfsl(dfsl(par[0][i]).second).first;
				vis[i] = 0;
				vis[par[1][i]] = 0;
			}
		}
		reverse(all(ord));
		for(auto &i : ord){
			for(auto &j : gph[i]){
				if(j == par[0][i]) continue;
				far[i] = max(far[i], far[j] + 1);
				diam[i] = max({diam[i], diam[j], far[j] + 1});
				fars[i].emplace_back(far[j], j);
			}
			sort(all(fars[i]));
			reverse(all(fars[i]));
			if(sz(fars[i]) >= 2) diam[i] = max(diam[i], (int)fars[i][0].first + (int)fars[i][1].first + 2);
		}
		reverse(all(ord));
		for(auto &i : ord){
			if(i == 0) continue;
			int cnt = 0;
			for(auto &j : fars[par[0][i]]){
				if(j.second == i) continue;
				cnt++;
				pfar[i] += j.first + 1;
				if(cnt == 2) break;
			}
			fars[i].emplace_back(pfar[i], par[0][i]);
			sort(all(fars[i]));
			reverse(all(fars[i]));
		}
	}
	int ans = 2 * n - 2 - diam[0];
	for(auto &x : qry){
		int l = lca(x.s, x.e);
		vector<int> v, w;
		for(int i = x.s; i != l; i = par[0][i]) v.push_back(i);
		for(int i = x.e; i != l; i = par[0][i]) w.push_back(i);
		reverse(all(w));
		v.push_back(l);
		for(auto &i : w) v.push_back(i);
		for(auto &i : v) vis[i] = 1;
		vector<int> val;
		vector<int> ndiam;
		int maxPath = -1e9;
		for(int i = x.s; dep[i] >= dep[l] + 2; i = par[0][i]) maxPath = max(maxPath, f[i] - 3 + sz(v));
		for(int i = x.e; dep[i] >= dep[l] + 2; i = par[0][i]) maxPath = max(maxPath, f[i] - 3 + sz(v));
		if(l != x.s){
			maxPath = max(maxPath, diam[x.s] - 3 + sz(v));
		}
		if(l != x.e){
			maxPath = max(maxPath, diam[x.e] - 3 + sz(v));
		}
		{
			int new_diam = 0;
			int cnt = 0;
			for(auto &[d, v] : fars[l]){
				if((in(v, x.s) || in(v, x.e)) && v != par[0][l]) continue;
				new_diam += d + 1;
				cnt += 1;
				if(cnt == 2) break;
			}
			maxPath = max(maxPath, new_diam - 3 + sz(v));
		}
		for(auto &i : v){
			vis[i] = 0;
			val.push_back(dfsl(i).first);
			vis[i] = 1;
		}
		for(auto &i : v) vis[i] = 0;
		int pmax = -1e9;
		for(int i = 0; i < sz(val); i++){
			maxPath = max(maxPath, sz(val) - 1 - i + val[i] + pmax);
			pmax = max(pmax, i + val[i]);
		}
		ans = min(ans, 2 * n - 4 + x.x - maxPath);
	}
	cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
16 Correct 11 ms 23952 KB Output is correct
17 Correct 11 ms 24012 KB Output is correct
18 Correct 11 ms 24012 KB Output is correct
19 Correct 11 ms 24012 KB Output is correct
20 Correct 11 ms 24012 KB Output is correct
21 Incorrect 11 ms 24012 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 622 ms 25348 KB Output is correct
2 Correct 640 ms 25436 KB Output is correct
3 Correct 604 ms 25268 KB Output is correct
4 Correct 602 ms 25240 KB Output is correct
5 Correct 571 ms 25180 KB Output is correct
6 Correct 360 ms 24900 KB Output is correct
7 Correct 634 ms 25428 KB Output is correct
8 Correct 737 ms 25288 KB Output is correct
9 Correct 673 ms 25412 KB Output is correct
10 Correct 565 ms 25224 KB Output is correct
11 Correct 591 ms 25292 KB Output is correct
12 Correct 605 ms 25284 KB Output is correct
13 Correct 577 ms 25292 KB Output is correct
14 Correct 586 ms 25300 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
16 Correct 11 ms 23952 KB Output is correct
17 Correct 11 ms 24012 KB Output is correct
18 Correct 11 ms 24012 KB Output is correct
19 Correct 11 ms 24012 KB Output is correct
20 Correct 11 ms 24012 KB Output is correct
21 Incorrect 11 ms 24012 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
16 Correct 11 ms 23952 KB Output is correct
17 Correct 11 ms 24012 KB Output is correct
18 Correct 11 ms 24012 KB Output is correct
19 Correct 11 ms 24012 KB Output is correct
20 Correct 11 ms 24012 KB Output is correct
21 Incorrect 11 ms 24012 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
16 Correct 11 ms 23952 KB Output is correct
17 Correct 11 ms 24012 KB Output is correct
18 Correct 11 ms 24012 KB Output is correct
19 Correct 11 ms 24012 KB Output is correct
20 Correct 11 ms 24012 KB Output is correct
21 Incorrect 11 ms 24012 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
16 Correct 11 ms 23952 KB Output is correct
17 Correct 11 ms 24012 KB Output is correct
18 Correct 11 ms 24012 KB Output is correct
19 Correct 11 ms 24012 KB Output is correct
20 Correct 11 ms 24012 KB Output is correct
21 Incorrect 11 ms 24012 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 23884 KB Output is correct
2 Correct 12 ms 23888 KB Output is correct
3 Correct 13 ms 23924 KB Output is correct
4 Correct 11 ms 24004 KB Output is correct
5 Correct 13 ms 23884 KB Output is correct
6 Correct 11 ms 23884 KB Output is correct
7 Correct 12 ms 23904 KB Output is correct
8 Correct 12 ms 23884 KB Output is correct
9 Correct 11 ms 23900 KB Output is correct
10 Correct 11 ms 23884 KB Output is correct
11 Correct 10 ms 23924 KB Output is correct
12 Correct 12 ms 24012 KB Output is correct
13 Correct 11 ms 23992 KB Output is correct
14 Correct 11 ms 23996 KB Output is correct
15 Correct 13 ms 23884 KB Output is correct
16 Correct 11 ms 23952 KB Output is correct
17 Correct 11 ms 24012 KB Output is correct
18 Correct 11 ms 24012 KB Output is correct
19 Correct 11 ms 24012 KB Output is correct
20 Correct 11 ms 24012 KB Output is correct
21 Incorrect 11 ms 24012 KB Output isn't correct
22 Halted 0 ms 0 KB -