Submission #679552

# Submission time Handle Problem Language Result Execution time Memory
679552 2023-01-08T13:32:46 Z Dan4Life Swapping Cities (APIO20_swap) C++17
6 / 100
648 ms 184324 KB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back

const int maxn = (int)1e6+10;
const int lgn = 31;

int n, m, num;
bool good[maxn];
int jmp[lgn][maxn], goodd[lgn][maxn];
vector<int> adj[maxn];
struct Edge{ int u, v, w; };
int p[maxn], lev[maxn], wei[maxn], deg[maxn];

Edge edge[maxn];

int getPath(int x, int steps){
	for(int i = lgn-1; i >= 0; i--)
		if(steps&(1<<i) and x!=-1) x = jmp[i][x];
	return x; 
}

int lca(int a, int b){
	if(a==b) return a;
	if(jmp[0][a]==jmp[0][b]) return jmp[0][a];
	if(lev[a] < lev[b]) swap(a,b);
	a = getPath(a, lev[a]-lev[b]);
	for(int i = lgn-1; i >= 0; i--)
		if(jmp[i][a]!=-1 and jmp[i][a]!=jmp[i][b])
			a = jmp[i][a], b = jmp[i][b];
	return lca(a,b);
}

int findSet(int i){ return p[i]==i?i:p[i]=findSet(p[i]); }
bool isSameSet(int i, int j) { return findSet(i)==findSet(j); }

void unionSet(Edge &e){
	int i = e.u, j = e.v;
	deg[i]++, deg[j]++;
	bool chk = (deg[i]>=3 or deg[j]>=3);
	int x = findSet(i), y = findSet(j);
	if(x!=y) adj[num].pb(y);
	adj[num].pb(x); p[x]=p[y]=num;
	good[num] |= good[x]|good[y]|chk|(x==y);
	wei[num] = e.w; num++;
}

void dfs(int s, int p){
	if(p!=-1) lev[s] = lev[p]+1, jmp[0][s] = p; 
	goodd[0][s] = good[s]; 
	for(auto u : adj[s]) if(u!=p) dfs(u,s);
}

void init(int N, int M, vector<int> u, vector<int> v, vector<int> w) {
	n = N, m = M; num = n; memset(jmp,-1,sizeof(jmp));
	for(int i = 0; i < n+m; i++) p[i] = i;
	for(int i = 0; i < m; i++) edge[i] = {u[i],v[i],w[i]};
	sort(edge,edge+m,[&](Edge &x, Edge &y){ return x.w<y.w; });
	for(int i = 0; i < m; i++) unionSet(edge[i]);
	dfs(num-1,-1);
	for(int i = 1; i < lgn; i++)
		for(int j = 0; j < num; j++)
			if(jmp[i-1][j]!=-1) jmp[i][j] = jmp[i-1][jmp[i-1][j]];
	for(int i = 1; i < lgn; i++)
		for(int j = 0; j < num; j++)
			goodd[i][j] = goodd[i-1][j] | goodd[i-1][goodd[i-1][j]];
}

int getMinimumFuelCapacity(int x, int y) {
	int z = lca(x,y);
	for(int i = lgn-1; i >= 0; i--) 
		if(jmp[i][z]!=-1 and !goodd[i][z]) z = jmp[i][z];
	if(good[z]) return wei[z];
	if(jmp[0][z]!=-1) z=jmp[0][z];
	return good[z]?wei[z]:-1;
}

/*
5 6
0 1 4
0 2 4
1 2 1
1 3 2
1 4 10
2 3 3
3
1 2
2 4
0 1
*/
# Verdict Execution time Memory Grader output
1 Correct 55 ms 145356 KB Output is correct
2 Correct 56 ms 145276 KB Output is correct
3 Correct 56 ms 145392 KB Output is correct
4 Correct 56 ms 145472 KB Output is correct
5 Correct 57 ms 145596 KB Output is correct
6 Correct 60 ms 145688 KB Output is correct
7 Correct 57 ms 145624 KB Output is correct
8 Correct 56 ms 145760 KB Output is correct
9 Correct 113 ms 171540 KB Output is correct
10 Correct 130 ms 177336 KB Output is correct
11 Correct 136 ms 176872 KB Output is correct
12 Correct 140 ms 178704 KB Output is correct
13 Correct 125 ms 181012 KB Output is correct
14 Correct 128 ms 171536 KB Output is correct
15 Correct 293 ms 179436 KB Output is correct
16 Correct 320 ms 178556 KB Output is correct
17 Correct 342 ms 180476 KB Output is correct
18 Correct 538 ms 182800 KB Output is correct
19 Correct 147 ms 154160 KB Output is correct
20 Correct 321 ms 180712 KB Output is correct
21 Correct 304 ms 179716 KB Output is correct
22 Correct 303 ms 181936 KB Output is correct
23 Correct 512 ms 184220 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 55 ms 145356 KB Output is correct
2 Correct 56 ms 145276 KB Output is correct
3 Incorrect 648 ms 184324 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 55 ms 145356 KB Output is correct
2 Correct 56 ms 145276 KB Output is correct
3 Correct 56 ms 145392 KB Output is correct
4 Correct 56 ms 145472 KB Output is correct
5 Correct 57 ms 145596 KB Output is correct
6 Correct 60 ms 145688 KB Output is correct
7 Correct 57 ms 145624 KB Output is correct
8 Correct 56 ms 145760 KB Output is correct
9 Incorrect 56 ms 145356 KB Output isn't correct
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 56 ms 145356 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 55 ms 145356 KB Output is correct
2 Correct 56 ms 145276 KB Output is correct
3 Correct 56 ms 145392 KB Output is correct
4 Correct 56 ms 145472 KB Output is correct
5 Correct 57 ms 145596 KB Output is correct
6 Correct 60 ms 145688 KB Output is correct
7 Correct 57 ms 145624 KB Output is correct
8 Correct 56 ms 145760 KB Output is correct
9 Correct 113 ms 171540 KB Output is correct
10 Correct 130 ms 177336 KB Output is correct
11 Correct 136 ms 176872 KB Output is correct
12 Correct 140 ms 178704 KB Output is correct
13 Correct 125 ms 181012 KB Output is correct
14 Correct 128 ms 171536 KB Output is correct
15 Correct 293 ms 179436 KB Output is correct
16 Correct 320 ms 178556 KB Output is correct
17 Correct 342 ms 180476 KB Output is correct
18 Correct 538 ms 182800 KB Output is correct
19 Incorrect 648 ms 184324 KB Output isn't correct
20 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 56 ms 145356 KB Output isn't correct
2 Halted 0 ms 0 KB -