제출 #1226413

#제출 시각아이디문제언어결과실행 시간메모리
1226413chaeryeongTruck Driver (IOI23_deliveries)C++20
43 / 100
5593 ms33844 KiB
#include "deliveries.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 1;
vector <pair <int, ll>> adj[N];
ll dep[N];
pair <ll, ll> e[N];
int nxt[N], sze[N], in[N], timer;
#define mid ((l + r) >> 1)
#define tl (node << 1)
#define tr (node << 1 | 1)
struct SegmentTree1 {
	ll tree[N << 2], lazy[N << 2];
	void prop (int l, int r, int node) {
		if (l != r) {
			lazy[tl] += lazy[node];
			lazy[tr] += lazy[node];
		}
		tree[node] += (ll)(r - l + 1) * lazy[node];
		lazy[node] = 0;
	}
	void update (int l, int r, int a, int b, ll c, int node) {
		prop(l, r, node);
		if (l > b || r < a) return;
		if (l >= a && r <= b) {
			lazy[node] += c;
			prop(l, r, node);
			return;
		}
		update(l, mid, a, b, c, tl); 
		update(mid + 1, r, a, b, c, tr);
		tree[node] = tree[tl] + tree[tr];
	}
	ll get (int l, int r, int a, int b, int node) {
		prop(l, r, node);
		if (l > b || r < a) return 0;
		if (l >= a && r <= b) return tree[node];
		return get(l, mid, a, b, tl) + get(mid + 1, r, a, b, tr);
	}
} cur;	
struct SegmentTree2 {
	ll tree[N << 2], sum[N << 2], lazy[N << 2], a[N];
	void init (int l, int r, int node) {
		if (l == r) {
			sum[node] = a[l];
		} else {
			init(l, mid, tl); init(mid + 1, r, tr);
			sum[node] = sum[tl] + sum[tr];
		}
	}
	void prop (int l, int r, int node) {
		if (l != r) {
			lazy[tl] += lazy[node];
			lazy[tr] += lazy[node];
		}
		tree[node] += sum[node] * lazy[node];
		lazy[node] = 0;
	}
	void update (int l, int r, int a, int b, ll c, int node) {
		prop(l, r, node);
		if (l > b || r < a) return;
		if (l >= a && r <= b) {
			lazy[node] += c;
			prop(l, r, node);
			return;
		}
		update(l, mid, a, b, c, tl); update(mid + 1, r, a, b, c, tr);
		tree[node] = tree[tl] + tree[tr];
	}
	ll get (int l, int r, int a, int b, int node) {
		prop(l, r, node);
		if (l > b || r < a) return 0;
		if (l >= a && r <= b) return tree[node];
		return get(l, mid, a, b, tl) + get(mid + 1, r, a, b, tr);
	}
} cur2;	
void dfs (int pos, int par) {
	if (par != -1) {
		for (int i = 0; i < (int)adj[pos].size(); i++) {
			if (adj[pos][i].first == par) {
				adj[pos].erase(adj[pos].begin() + i);
				break;
			}
		}
	}
	sze[pos] = 1;
	for (auto [j, w] : adj[pos]) {
		dfs(j, pos);
		sze[pos] += sze[j];
	}
}
void dfs2 (int pos) {
	in[pos] = timer++;
	for (auto &j : adj[pos]) {
		if (sze[j.first] > sze[adj[pos][0].first]) {
			swap(adj[pos][0], j);
		}
	}
	for (auto [j, w] : adj[pos]) {
		dep[j] = w + dep[pos];
		nxt[j] = (j == adj[pos][0].first ? nxt[pos] : j);
		e[j] = {w, pos};
		dfs2(j);
	}
}
int n, t[N];
void init (int _N, vector <int> u, vector <int> v, vector <int> w, vector <int> T) {
	n = _N;
	for (int i = 0; i < n; i++) {
		t[i] = T[i];
	}
	for (int i = 0; i < n - 1; i++) {
		adj[u[i]].push_back({v[i], w[i]});
		adj[v[i]].push_back({u[i], w[i]});
	}
	dfs(0, -1);
	nxt[0] = 0;
	dfs2(0);
	for (int i = 1; i < n; i++) {
		cur2.a[in[i]] = e[i].first;
	}
	cur2.init(0, n - 1, 1);
	for (int i = 0; i < n; i++) {
		int u = i;
		while (nxt[u] != 0) {
			cur.update(0, n - 1, in[nxt[u]], in[u], t[i], 1);
			cur2.update(0, n - 1, in[nxt[u]], in[u], t[i], 1);
			u = e[nxt[u]].second;
		}
		cur.update(0, n - 1, in[0], in[u], t[i], 1);
		cur2.update(0, n - 1, in[0], in[u], t[i], 1);
	}
}
ll get (int pos, int par) {
	ll ret = 0;
	for (auto [j, w] : adj[pos]) {
		if (j != par) {
			ll o = cur.get(0, n - 1, in[j], in[j], 1);
			ll f = cur.get(0, n - 1, in[0], in[0], 1);
			if (o * 2 > f) {
				ret += get(j, pos);
				ret += 2 * w * (f - 2 * o + 1);
				break;
			}
		}
	}
	return ret;
}
ll max_time (int s, int x) {
	int delta = x - t[s];
	t[s] = x;
	int u = s;
	while (nxt[u] != 0) {
		cur.update(0, n - 1, in[nxt[u]], in[u], delta, 1);
		cur2.update(0, n - 1, in[nxt[u]], in[u], delta, 1);
		u = e[nxt[u]].second;
	}
	cur.update(0, n - 1, in[0], in[u], delta, 1);
	cur2.update(0, n - 1, in[0], in[u], delta, 1);
	return 2 * cur2.get(0, n - 1, 0, n - 1, 1) + get(0, -1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...