Submission #559312

# Submission time Handle Problem Language Result Execution time Memory
559312 2022-05-09T15:16:21 Z LastRonin Road Closures (APIO21_roads) C++11
22 / 100
695 ms 58308 KB
#include "roads.h"

#include <bits/stdc++.h>

#define speed ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) 
#define ll long long
#define pii pair<ll, ll>
#define f first
#define s second
#define mp make_pair
#define pinode pair<node*, node*>
#define pb push_back
 
using namespace std;
 
const int N = 2e5 + 10;

mt19937 bruh(chrono::steady_clock::now().time_since_epoch().count());



struct node {
	node *l = nullptr, *r = nullptr;
	ll sz = 1, y = 0, sum = 0, x = 0;
	node(ll nx) {
		x = nx;
		sz = 1;
		l = r = nullptr;
		y = bruh();
		sum = nx;
	}
} *rt[N];

void pull(node *a) {
	if(!a)return;
	a->sum = a->x;
	a->sz = 1;
	if(a->l != nullptr)a->sum += a->l->sum, a->sz += a->l->sz;
	if(a->r != nullptr)a->sum += a->r->sum, a->sz += a->r->sz;
}

node *mrg(node *a, node *b) {
	if(a == nullptr || b == nullptr)
		return (a != nullptr ? a : b);
	if(a->y > b->y) {
		a->r = mrg(a->r, b);
		pull(a);
		return a;
	}
	b->l = mrg(a, b->l);
	pull(b);
	return b;
}

pinode splitSz(node *a, ll F) {
	if(a == nullptr) 
		return mp(nullptr, nullptr);
	if((a->l ? a->l->sz : 0) >= F) {
		pinode z = splitSz(a->l, F);
		a->l = z.s;
		pull(a);
		return mp(z.f, a);					
	}
	else {
		ll dlt = F - (a->l ? a->l->sz + 1 : 1);
		pinode z = splitSz(a->r, dlt);
		a->r = z.f;
		pull(a);
		return mp(a, z.s);
	}
}

pinode splitX(node *a, ll x) {
	if(a == nullptr) 
		return mp(nullptr, nullptr);
	if(a->x <= x) {
		pinode z = splitX(a->r, x);
		a->r = z.f;
		pull(a);
		return mp(a, z.s);			
	}
	else {
		pinode z = splitX(a->l, x);
		a->l = z.s;
		pull(a);
		return mp(z.f, a);
	}
}


ll get(ll v, ll del) {
	if(del <= 0)return 0;
	pinode z = splitSz(rt[v], del);
    ll sum = (z.f ? z.f->sum : 0);
	rt[v] = mrg(z.f, z.s);
	return sum;
}

void insert(ll v, ll zn) {
	pinode z = splitX(rt[v], zn);
	node *u = new node(zn);
	rt[v] = mrg(mrg(z.f, u), z.s);
}

void dele(ll v, ll zn) {
	pinode z = splitX(rt[v], zn - 1);
	pinode z2 = splitSz(z.s, 1);
	rt[v] = mrg(z.f, z2.s);
}


ll dp[N][2];
bool was[N];

vector<int> act;
vector<pii> g[N];
vector<pii> g2[N];
vector<int> st[N];

void solve(ll v, ll p, ll x) {
	ll del = ((ll)g2[v].size()) - x;
	was[v] = 1;
	for(auto u : g[v]) {
		if(u.f != p) {
			solve(u.f, v, x);
		}
	}
	ll sum = 0;
	for(auto u : g[v]) {
		if(u.f != p) {
			sum += dp[u.f][1];
			if(dp[u.f][0] + u.s - dp[u.f][1] < 0)
				sum += dp[u.f][0] + u.s - dp[u.f][1], del--;
			else
				insert(v, dp[u.f][0] + u.s - dp[u.f][1]);		
		}
	}
	dp[v][0] = sum + get(v, del - 1);
	dp[v][1] = sum + get(v, del);	
	for(auto u : g[v]) {
		if(u.f != p) {
		    if(dp[u.f][0] + u.s - dp[u.f][1] >= 0)
				dele(v, dp[u.f][0] + u.s - dp[u.f][1]);
		}
	}
}

vector<ll> minimum_closure_costs(int n, vector<int> U, vector<int> V, vector<int> W) {
	for(int i = 0; i <= n; i++)
		rt[i] = nullptr;	
	vector<ll> answ;
	for(int j = 0; j < n; j++)
		U[j]++, V[j]++;
	for(int i = 1; i < n; i++) {
		g2[U[i - 1]].pb(mp(V[i - 1], W[i - 1]));
		g2[V[i - 1]].pb(mp(U[i - 1], W[i - 1]));
	}
	for(int i = 1; i <= n; i++) {
		st[g2[i].size()].pb(i);
	}
	for(int j = n - 1; j >= 0; j--) {
		for(auto v : st[j]) {
		    act.pb(v);
			for(auto u : g2[v]) {
				if((ll)g2[u.f].size() > j) {
					g[u.f].pb(mp(v, u.s));
					g[v].pb(u);
					dele(u.f, u.s);
				}
				else if((ll)g2[u.f].size() == j) {
					g[v].pb(u);									
				}
				else {
					insert(v, u.s);
				}
		   	}
		}
		ll ans = 0;
		for(auto u : act) {
			if(!was[u]) { 
				solve(u, 0, j);
				ans += dp[u][1];
			}
		}
		answ.pb(ans);
		for(auto u : act)was[u] = 0, dp[u][0] = dp[u][1] = 0;
	}           	
	reverse(answ.begin(), answ.end());
	return answ;
}
# Verdict Execution time Memory Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 14 ms 15092 KB Output is correct
3 Correct 14 ms 15132 KB Output is correct
4 Correct 11 ms 15128 KB Output is correct
5 Correct 8 ms 14420 KB Output is correct
6 Correct 9 ms 14420 KB Output is correct
7 Correct 9 ms 14484 KB Output is correct
8 Correct 13 ms 14904 KB Output is correct
9 Correct 14 ms 15060 KB Output is correct
10 Correct 8 ms 14420 KB Output is correct
11 Correct 10 ms 14420 KB Output is correct
12 Correct 236 ms 35172 KB Output is correct
13 Correct 451 ms 48984 KB Output is correct
14 Correct 566 ms 45336 KB Output is correct
15 Correct 649 ms 48728 KB Output is correct
16 Correct 695 ms 49248 KB Output is correct
17 Correct 261 ms 49188 KB Output is correct
18 Correct 8 ms 14420 KB Output is correct
19 Correct 272 ms 45744 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 95 ms 50016 KB Output is correct
3 Correct 100 ms 53696 KB Output is correct
4 Correct 118 ms 57040 KB Output is correct
5 Correct 126 ms 58308 KB Output is correct
6 Correct 10 ms 15060 KB Output is correct
7 Correct 11 ms 15188 KB Output is correct
8 Correct 10 ms 15188 KB Output is correct
9 Runtime error 19 ms 29168 KB Execution killed with signal 6
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 14420 KB Output is correct
2 Correct 8 ms 14316 KB Output is correct
3 Correct 8 ms 14292 KB Output is correct
4 Correct 9 ms 14420 KB Output is correct
5 Correct 8 ms 14492 KB Output is correct
6 Runtime error 20 ms 29232 KB Execution killed with signal 6
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 14420 KB Output is correct
2 Correct 8 ms 14316 KB Output is correct
3 Correct 8 ms 14292 KB Output is correct
4 Correct 9 ms 14420 KB Output is correct
5 Correct 8 ms 14492 KB Output is correct
6 Runtime error 20 ms 29232 KB Execution killed with signal 6
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 289 ms 52308 KB Output is correct
2 Correct 286 ms 51548 KB Output is correct
3 Correct 306 ms 57012 KB Output is correct
4 Correct 268 ms 53520 KB Output is correct
5 Correct 305 ms 57092 KB Output is correct
6 Correct 328 ms 55100 KB Output is correct
7 Correct 292 ms 55940 KB Output is correct
8 Correct 261 ms 46212 KB Output is correct
9 Correct 231 ms 54944 KB Output is correct
10 Correct 266 ms 53764 KB Output is correct
11 Correct 291 ms 54488 KB Output is correct
12 Correct 271 ms 52168 KB Output is correct
13 Correct 9 ms 14388 KB Output is correct
14 Correct 101 ms 53856 KB Output is correct
15 Correct 108 ms 58268 KB Output is correct
16 Correct 11 ms 15192 KB Output is correct
17 Correct 11 ms 15088 KB Output is correct
18 Correct 12 ms 15188 KB Output is correct
19 Correct 11 ms 15060 KB Output is correct
20 Correct 11 ms 15192 KB Output is correct
21 Correct 246 ms 45668 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 289 ms 52308 KB Output is correct
2 Correct 286 ms 51548 KB Output is correct
3 Correct 306 ms 57012 KB Output is correct
4 Correct 268 ms 53520 KB Output is correct
5 Correct 305 ms 57092 KB Output is correct
6 Correct 328 ms 55100 KB Output is correct
7 Correct 292 ms 55940 KB Output is correct
8 Correct 261 ms 46212 KB Output is correct
9 Correct 231 ms 54944 KB Output is correct
10 Correct 266 ms 53764 KB Output is correct
11 Correct 291 ms 54488 KB Output is correct
12 Correct 271 ms 52168 KB Output is correct
13 Correct 9 ms 14388 KB Output is correct
14 Correct 101 ms 53856 KB Output is correct
15 Correct 108 ms 58268 KB Output is correct
16 Correct 11 ms 15192 KB Output is correct
17 Correct 11 ms 15088 KB Output is correct
18 Correct 12 ms 15188 KB Output is correct
19 Correct 11 ms 15060 KB Output is correct
20 Correct 11 ms 15192 KB Output is correct
21 Correct 246 ms 45668 KB Output is correct
22 Correct 9 ms 14292 KB Output is correct
23 Correct 7 ms 14292 KB Output is correct
24 Correct 9 ms 14420 KB Output is correct
25 Correct 212 ms 46636 KB Output is correct
26 Correct 169 ms 43264 KB Output is correct
27 Correct 266 ms 51796 KB Output is correct
28 Correct 405 ms 54356 KB Output is correct
29 Correct 358 ms 51432 KB Output is correct
30 Correct 461 ms 51112 KB Output is correct
31 Correct 449 ms 52688 KB Output is correct
32 Correct 226 ms 50104 KB Output is correct
33 Correct 483 ms 47064 KB Output is correct
34 Correct 312 ms 53356 KB Output is correct
35 Correct 238 ms 56304 KB Output is correct
36 Correct 388 ms 52120 KB Output is correct
37 Correct 462 ms 50132 KB Output is correct
38 Correct 68 ms 40136 KB Output is correct
39 Correct 103 ms 56800 KB Output is correct
40 Runtime error 22 ms 30164 KB Execution killed with signal 6
41 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 14 ms 15092 KB Output is correct
3 Correct 14 ms 15132 KB Output is correct
4 Correct 11 ms 15128 KB Output is correct
5 Correct 8 ms 14420 KB Output is correct
6 Correct 9 ms 14420 KB Output is correct
7 Correct 9 ms 14484 KB Output is correct
8 Correct 13 ms 14904 KB Output is correct
9 Correct 14 ms 15060 KB Output is correct
10 Correct 8 ms 14420 KB Output is correct
11 Correct 10 ms 14420 KB Output is correct
12 Correct 236 ms 35172 KB Output is correct
13 Correct 451 ms 48984 KB Output is correct
14 Correct 566 ms 45336 KB Output is correct
15 Correct 649 ms 48728 KB Output is correct
16 Correct 695 ms 49248 KB Output is correct
17 Correct 261 ms 49188 KB Output is correct
18 Correct 8 ms 14420 KB Output is correct
19 Correct 272 ms 45744 KB Output is correct
20 Correct 7 ms 14420 KB Output is correct
21 Correct 95 ms 50016 KB Output is correct
22 Correct 100 ms 53696 KB Output is correct
23 Correct 118 ms 57040 KB Output is correct
24 Correct 126 ms 58308 KB Output is correct
25 Correct 10 ms 15060 KB Output is correct
26 Correct 11 ms 15188 KB Output is correct
27 Correct 10 ms 15188 KB Output is correct
28 Runtime error 19 ms 29168 KB Execution killed with signal 6
29 Halted 0 ms 0 KB -