답안 #831980

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
831980 2023-08-20T19:02:58 Z NK_ Grapevine (NOI22_grapevine) C++17
100 / 100
2009 ms 127012 KB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
 
using namespace std;
 
#define nl '\n'
#define pb push_back
#define pf push_front
 
#define mp make_pair
#define f first
#define s second
#define sz(x) int(x.size())
 
template<class T> using V = vector<T>;
using pi = pair<int, int>;
using vi = V<int>;
using vpi = V<pi>;
 
using ll = long long;
using pl = pair<ll, ll>;
using vpl = V<pl>;
using vl = V<ll>;
 
using db = long double;
 
template<class T> using pq = priority_queue<T, V<T>, greater<T>>;
 
const int MOD = 1e9 + 7;
const ll INFL = ll(1e17);
 
// START OF SEGTREE
struct Seg {
	const ll ID = INFL, IDL = 0; ll comb(ll a, ll b) { return min(a, b); }
	int n; vl seg, lazy;
	void init(int N) {
		n = 1; while(n < N) n *= 2;
		seg.assign(2*n, ID); lazy.assign(2*n, IDL);
	}
 
	void pull(int x) { seg[x] = comb(seg[2*x], seg[2*x+1]); } 
 
	void push(int x, int L, int R) {
		seg[x] += lazy[x];
		if (L != R) for(int i = 0; i < 2; i++) lazy[2*x+i] += lazy[x];
		lazy[x] = IDL;
	}
 
	void upd(int l, int r, ll v, int x, int L, int R) {
		push(x, L, R); if (r < L || R < l) return;
		if (l <= L && R <= r) {
			lazy[x] = v; push(x, L, R); return;
		}
		int M = (L + R) / 2;
		upd(l, r, v, 2*x, L, M);
		upd(l, r, v, 2*x+1, M+1, R);
		pull(x);
	}
 
	ll query(int l, int r, int x, int L, int R) {
		push(x, L, R); if (r < L || R < l) return 2 * ID;
		if (l <= L && R <= r) return seg[x];
		int M = (L + R) / 2;
		return comb(query(l, r, 2*x, L, M), query(l, r, 2*x+1, M+1, R));
	}
 
	void upd(int l, int r, ll v) { upd(l, r, v, 1, 0, n - 1); }
	ll query(int l, int r) { return query(l, r, 1, 0, n - 1); }
	ll query() { return seg[1]; }
};
// END OF SEGTREE
 
 
const int nax = 1e5 + 5;
 
// MAIN
vpi adj[nax]; int W[nax];
 
// CENTROID
int sub[nax], proc[nax], siz[nax];
 
// CENTROID SUBTREES
const int LG = 19;
int eid[nax][LG], st[nax][LG], en[nax][LG], par[nax][LG];
Seg T[nax];
// __[u][t] = a property of the subtree rooted at u's t-th parent in the centroid tree
 
// START OF CENTROID
void gen(int u, int p = -1) {
	sub[u] = 1;
	for(auto& e : adj[u]) {
		int v, i; tie(v, i) = e;
		if (v != p && !proc[v]) {
			gen(v, u); sub[u] += sub[v];
		}
	}
}
 
int t = 0, C = -1;
int LVL = 0;
void dfs(int u, int p = -1) {
	par[u][LVL] = C; st[u][LVL] = t++;
	for(auto& e : adj[u]) {
		int v, i; tie(v, i) = e;
		if (v != p && !proc[v]) {
			eid[v][LVL] = i;
			dfs(v, u);
		}
	}
	en[u][LVL] = t - 1;
}
 
int find(int u, int n, int p = -1) {
	for(auto& e : adj[u]) {
		int v, i; tie(v, i) = e;
		if (v != p && !proc[v]) {
			if (2 * sub[v] > n) return find(v, n, u);
		}
	}
	return u;
}
 
int init(int u = 0) {
	gen(u); int c = find(u, sub[u]);
 
	t = 0, C = c, eid[c][LVL] = -1; dfs(c);
	proc[c] = 1;
 
	siz[c] = sub[u];
	assert(t <= siz[c]);
	T[c].init(siz[c]);
 
	for(auto& e : adj[c]) {
		int v, i; tie(v, i) = e;
		if (!proc[v]) {
			++LVL; init(v); --LVL;
		}
	}
 
	return c;
}
// END OF CENTROID
 
int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	memset(par, -1, sizeof(par));
 
	int N, Q; cin >> N >> Q;
 
	unordered_map<ll, int> E;
	for(int i = 0; i < N - 1; i++) {
		int u, v; cin >> u >> v >> W[i]; --u, --v;
		adj[u].pb(mp(v, i));
		adj[v].pb(mp(u, i));
		E[u * 1LL * N + v] = E[v * 1LL * N + u] = i;
	}
 
	int R = init();
 
	for(int u = 0; u < N; u++) {
		for(int p = 0; p < LG; p++) {
			int e = eid[u][p], x = par[u][p]; if (x == -1) continue;
			if (e != -1) T[x].upd(st[u][p], en[u][p], W[e]);
		}
	}
 
	for(int q = 0; q < Q; q++) {
		int type; cin >> type;
 
		if (type == 1) {
			int u; cin >> u; --u;
			
			ll ans = 2 * INFL;
 
			for(int p = 0; p < LG; p++) {
				int x = par[u][p], pos = st[u][p]; 
 				if (x == -1) continue;
 
				ll dst = T[x].query(pos, pos);
				if (dst >= INFL) dst -= INFL;
 
				ans = min(ans, dst + T[x].query());
			}
			cout << (ans >= INFL ? -1 : ans) << nl;
		}
 
		if (type == 2) {
			int u; cin >> u; --u;
			for(int p = 0; p < LG; p++) {
				int x = par[u][p], pos = st[u][p]; 
 				if (x == -1) continue;
 
				if (T[x].query(pos, pos) >= INFL) T[x].upd(pos, pos, -INFL);
				else T[x].upd(pos, pos, +INFL);
			}
		}
 
		if (type == 3) {
			int u, v, w; cin >> u >> v >> w; --u, --v;
 
			int i = E[u * 1LL * N + v];
 
			for(int rep = 0; rep < 2; rep++) {
				for(int p = 0; p < LG; p++) {
					int x = par[u][p], e = eid[u][p]; if (x == -1) continue;
 
					if (e == i) T[x].upd(st[u][p], en[u][p], w - W[i]);
				}
 
				swap(u, v);
			}
 
			W[i] = w;
		}
 
	}
 
 
 
    return 0;
} 	

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:159:6: warning: unused variable 'R' [-Wunused-variable]
  159 |  int R = init();
      |      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 18516 KB Output is correct
2 Correct 13 ms 18516 KB Output is correct
3 Correct 14 ms 18588 KB Output is correct
4 Correct 18 ms 18712 KB Output is correct
5 Correct 13 ms 18700 KB Output is correct
6 Correct 13 ms 18592 KB Output is correct
7 Correct 9 ms 18004 KB Output is correct
8 Correct 9 ms 18068 KB Output is correct
9 Correct 9 ms 18004 KB Output is correct
10 Correct 18 ms 18780 KB Output is correct
11 Correct 18 ms 18684 KB Output is correct
12 Correct 19 ms 18772 KB Output is correct
13 Correct 12 ms 18004 KB Output is correct
14 Correct 9 ms 17992 KB Output is correct
15 Correct 10 ms 18100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1229 ms 108412 KB Output is correct
2 Correct 1343 ms 107756 KB Output is correct
3 Correct 1317 ms 104976 KB Output is correct
4 Correct 1081 ms 125672 KB Output is correct
5 Correct 1070 ms 118576 KB Output is correct
6 Correct 1027 ms 120924 KB Output is correct
7 Correct 191 ms 64028 KB Output is correct
8 Correct 175 ms 63044 KB Output is correct
9 Correct 210 ms 63064 KB Output is correct
10 Correct 1042 ms 122144 KB Output is correct
11 Correct 1032 ms 121216 KB Output is correct
12 Correct 1133 ms 123668 KB Output is correct
13 Correct 211 ms 63204 KB Output is correct
14 Correct 224 ms 63208 KB Output is correct
15 Correct 206 ms 63772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1033 ms 107120 KB Output is correct
2 Correct 1142 ms 107504 KB Output is correct
3 Correct 1248 ms 107744 KB Output is correct
4 Correct 1054 ms 104036 KB Output is correct
5 Correct 1178 ms 104436 KB Output is correct
6 Correct 1255 ms 103700 KB Output is correct
7 Correct 1061 ms 103468 KB Output is correct
8 Correct 1095 ms 106776 KB Output is correct
9 Correct 1108 ms 103756 KB Output is correct
10 Correct 1110 ms 107728 KB Output is correct
11 Correct 1048 ms 104140 KB Output is correct
12 Correct 1132 ms 103020 KB Output is correct
13 Correct 1155 ms 106768 KB Output is correct
14 Correct 1170 ms 103064 KB Output is correct
15 Correct 1397 ms 104048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1349 ms 107104 KB Output is correct
2 Correct 1417 ms 106820 KB Output is correct
3 Correct 1430 ms 105108 KB Output is correct
4 Correct 1260 ms 125800 KB Output is correct
5 Correct 1228 ms 121740 KB Output is correct
6 Correct 1331 ms 123164 KB Output is correct
7 Correct 240 ms 63388 KB Output is correct
8 Correct 238 ms 64284 KB Output is correct
9 Correct 218 ms 63464 KB Output is correct
10 Correct 1189 ms 123516 KB Output is correct
11 Correct 1242 ms 120440 KB Output is correct
12 Correct 1266 ms 124352 KB Output is correct
13 Correct 211 ms 63324 KB Output is correct
14 Correct 243 ms 64800 KB Output is correct
15 Correct 252 ms 63928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1488 ms 108268 KB Output is correct
2 Correct 2009 ms 109432 KB Output is correct
3 Correct 1314 ms 106828 KB Output is correct
4 Correct 1198 ms 119572 KB Output is correct
5 Correct 1194 ms 127012 KB Output is correct
6 Correct 1352 ms 121744 KB Output is correct
7 Correct 295 ms 63592 KB Output is correct
8 Correct 271 ms 64268 KB Output is correct
9 Correct 193 ms 64292 KB Output is correct
10 Correct 1399 ms 118060 KB Output is correct
11 Correct 1114 ms 122008 KB Output is correct
12 Correct 1336 ms 116776 KB Output is correct
13 Correct 231 ms 64524 KB Output is correct
14 Correct 188 ms 63644 KB Output is correct
15 Correct 189 ms 63652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 18516 KB Output is correct
2 Correct 13 ms 18516 KB Output is correct
3 Correct 14 ms 18588 KB Output is correct
4 Correct 18 ms 18712 KB Output is correct
5 Correct 13 ms 18700 KB Output is correct
6 Correct 13 ms 18592 KB Output is correct
7 Correct 9 ms 18004 KB Output is correct
8 Correct 9 ms 18068 KB Output is correct
9 Correct 9 ms 18004 KB Output is correct
10 Correct 18 ms 18780 KB Output is correct
11 Correct 18 ms 18684 KB Output is correct
12 Correct 19 ms 18772 KB Output is correct
13 Correct 12 ms 18004 KB Output is correct
14 Correct 9 ms 17992 KB Output is correct
15 Correct 10 ms 18100 KB Output is correct
16 Correct 1229 ms 108412 KB Output is correct
17 Correct 1343 ms 107756 KB Output is correct
18 Correct 1317 ms 104976 KB Output is correct
19 Correct 1081 ms 125672 KB Output is correct
20 Correct 1070 ms 118576 KB Output is correct
21 Correct 1027 ms 120924 KB Output is correct
22 Correct 191 ms 64028 KB Output is correct
23 Correct 175 ms 63044 KB Output is correct
24 Correct 210 ms 63064 KB Output is correct
25 Correct 1042 ms 122144 KB Output is correct
26 Correct 1032 ms 121216 KB Output is correct
27 Correct 1133 ms 123668 KB Output is correct
28 Correct 211 ms 63204 KB Output is correct
29 Correct 224 ms 63208 KB Output is correct
30 Correct 206 ms 63772 KB Output is correct
31 Correct 1033 ms 107120 KB Output is correct
32 Correct 1142 ms 107504 KB Output is correct
33 Correct 1248 ms 107744 KB Output is correct
34 Correct 1054 ms 104036 KB Output is correct
35 Correct 1178 ms 104436 KB Output is correct
36 Correct 1255 ms 103700 KB Output is correct
37 Correct 1061 ms 103468 KB Output is correct
38 Correct 1095 ms 106776 KB Output is correct
39 Correct 1108 ms 103756 KB Output is correct
40 Correct 1110 ms 107728 KB Output is correct
41 Correct 1048 ms 104140 KB Output is correct
42 Correct 1132 ms 103020 KB Output is correct
43 Correct 1155 ms 106768 KB Output is correct
44 Correct 1170 ms 103064 KB Output is correct
45 Correct 1397 ms 104048 KB Output is correct
46 Correct 1349 ms 107104 KB Output is correct
47 Correct 1417 ms 106820 KB Output is correct
48 Correct 1430 ms 105108 KB Output is correct
49 Correct 1260 ms 125800 KB Output is correct
50 Correct 1228 ms 121740 KB Output is correct
51 Correct 1331 ms 123164 KB Output is correct
52 Correct 240 ms 63388 KB Output is correct
53 Correct 238 ms 64284 KB Output is correct
54 Correct 218 ms 63464 KB Output is correct
55 Correct 1189 ms 123516 KB Output is correct
56 Correct 1242 ms 120440 KB Output is correct
57 Correct 1266 ms 124352 KB Output is correct
58 Correct 211 ms 63324 KB Output is correct
59 Correct 243 ms 64800 KB Output is correct
60 Correct 252 ms 63928 KB Output is correct
61 Correct 1488 ms 108268 KB Output is correct
62 Correct 2009 ms 109432 KB Output is correct
63 Correct 1314 ms 106828 KB Output is correct
64 Correct 1198 ms 119572 KB Output is correct
65 Correct 1194 ms 127012 KB Output is correct
66 Correct 1352 ms 121744 KB Output is correct
67 Correct 295 ms 63592 KB Output is correct
68 Correct 271 ms 64268 KB Output is correct
69 Correct 193 ms 64292 KB Output is correct
70 Correct 1399 ms 118060 KB Output is correct
71 Correct 1114 ms 122008 KB Output is correct
72 Correct 1336 ms 116776 KB Output is correct
73 Correct 231 ms 64524 KB Output is correct
74 Correct 188 ms 63644 KB Output is correct
75 Correct 189 ms 63652 KB Output is correct
76 Correct 8 ms 17088 KB Output is correct
77 Correct 8 ms 17164 KB Output is correct
78 Correct 8 ms 17156 KB Output is correct
79 Correct 1358 ms 106108 KB Output is correct
80 Correct 1977 ms 107860 KB Output is correct
81 Correct 1925 ms 107596 KB Output is correct
82 Correct 1110 ms 121056 KB Output is correct
83 Correct 1188 ms 120976 KB Output is correct
84 Correct 1260 ms 122644 KB Output is correct
85 Correct 254 ms 64560 KB Output is correct
86 Correct 245 ms 64144 KB Output is correct
87 Correct 196 ms 63188 KB Output is correct
88 Correct 1047 ms 119700 KB Output is correct
89 Correct 1122 ms 120580 KB Output is correct
90 Correct 1149 ms 119268 KB Output is correct
91 Correct 214 ms 64604 KB Output is correct
92 Correct 186 ms 63616 KB Output is correct
93 Correct 213 ms 63304 KB Output is correct