Submission #574230

# Submission time Handle Problem Language Result Execution time Memory
574230 2022-06-08T08:20:40 Z amunduzbaev Inside information (BOI21_servers) C++17
50 / 100
428 ms 58460 KB
#include "bits/stdc++.h"
using namespace std;

#define ar array

const int N = 4e5 + 5;
vector<ar<int, 2>> edges[N];
int par[N][20], ed[N], lift[N][20];
int tin[N], tout[N], t, d[N];

void dfs(int u){
	tin[u] = ++t;
	lift[u][0] = (ed[u] > ed[par[u][0]]);
	for(int j=1;j<20;j++){
		par[u][j] = par[par[u][j-1]][j-1];
		lift[u][j] = lift[u][j-1] + lift[par[u][j-1]][j-1];
	}
	
	for(auto x : edges[u]){
		if(x[0] == par[u][0]) continue;
		par[x[0]][0] = u, ed[x[0]] = x[1];
		d[x[0]] = d[u] + 1;
		dfs(x[0]);
	}
	tout[u] = t;
}

bool is(int a, int b) { return (tin[a] <= tin[b] && tout[b] <= tout[a]); }

int check(int a, int b, int t){
	if(a == b) return true;
	//~ cout<<a<<" "<<b<<" "<<is(a, b)<<" "<<is(b, a)<<"\n";
	if(is(a, b)){
		int tot = 0;
		for(int j=19;~j;j--){
			if(!is(par[b][j], a)){
				tot += lift[b][j];
				b = par[b][j];
			}
		}
		return (!tot && ed[b] <= t);
	}
	
	if(is(b, a)){
		swap(a, b);
		int tot = 0, o = b;
		for(int j=19;~j;j--){
			if(!is(par[b][j], a)){
				tot += lift[b][j];
				b = par[b][j];
			}
		}
		//~ cout<<tot<<" "<<d[o] - d[b]<<" "<<ed[o]<<"\n";
		return (tot == d[o] - d[b] && ed[o] <= t);
	}
	
	int t1 = 0, t2 = 0, o = a;
	for(int j=19;~j;j--){
		if(!is(par[b][j], a)){
			t1 += lift[b][j];
			b = par[b][j];
		}
		
		if(!is(par[a][j], b)){
			t2 += lift[a][j];
			a = par[a][j];
		}
	}
	//~ cout<<a<<" "<<b<<"\n";
	//~ cout<<t1<<" "<<t2<<" "<<d[a] - d[o]<<" "<<ed[a]<<" "<<ed[b]<<" "<<ed[o]<<"\n";
	return (t1 == 0 && t2 == d[o] - d[a] && ed[a] > ed[b] && ed[o] <= t);
}

struct BIT{
	int tree[N];
	void add(int i, int v){
		for(;i<N;i+=(i&-i)) tree[i] += v;
	}
	
	int get(int i){
		int r = 0;
		for(;i>0;i-=(i&-i)) r += tree[i];
		return r;
	}
	
	int get(int l, int r){
		return get(r) - get(l - 1);
	}
}tree;

int res[N], used[N], sub[N];
int to[N], ver[N], pos[N];
vector<int> qq[N], tt, tot;
int face[N];

void dfs1(int u, int p = -1){
	sub[u] = 1;
	for(auto x : edges[u]){
		if(x[0] == p || used[x[0]]) continue;
		pos[x[1]] = x[0];
		to[x[0]] = x[1], dfs1(x[0], u);
		sub[u] += sub[x[0]];
	}
}

int cen(int u, int n, int p = -1){
	for(auto x : edges[u]){
		if(x[0] == p || used[x[0]]) continue;
		if(sub[x[0]] * 2 > n) return cen(x[0], n, u);
	} return u;
}

void dfs2(int u, int inc = 1, int dec = 1, int p = -1){
	if(dec){
		for(auto x : qq[u]){
			if(x < to[face[u]]) continue;
			tt.push_back(x);
			res[x]++;
		}
	}
	if(inc){
		tot.push_back(to[u]);
	}
	for(auto x : edges[u]){
		if(x[0] == p || used[x[0]]) continue;
		face[x[0]] = face[u];
		dfs2(x[0], inc & (to[u] < x[1]), dec & (to[u] > x[1]), u);
	}
}

void dec(int u){
	dfs1(u);
	u = cen(u, sub[u]);
	dfs1(u);
	
	tt.clear(), tot.clear();
	for(auto x : edges[u]){
		if(used[x[0]]) continue;
		face[x[0]] = x[0];
		dfs2(x[0], 1, 1, u);
	}
	
	sort(tt.begin(), tt.end());
	sort(tot.begin(), tot.end());
	sort(qq[u].begin(), qq[u].end());
	
	for(auto x : qq[u]){
		int cc = upper_bound(tot.begin(), tot.end(), x) - tot.begin();
		res[x] += cc;
	}
	
	int j = 0;
	for(auto x : tt){ 
		while(j < (int)tot.size() && tot[j] < x){
			tree.add(face[pos[tot[j]]], 1);
			j++;
		}
		
		res[x] += tree.get(face[ver[x]] + 1, N - 1);
	}
	
	for(int l=0;l<j;l++) tree.add(face[pos[tot[l]]], -1);
	used[u] = 1;
	for(auto x : edges[u]){
		if(used[x[0]]) continue;
		dec(x[0]);
	}
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n, m; cin>>n>>m;
	vector<ar<int, 3>> q;
	for(int i=1;i<n + m;i++){
		char c; cin>>c;
		if(c == 'S'){
			int a, b; cin>>a>>b;
			edges[a].push_back({b, i});
			edges[b].push_back({a, i});
		} if(c == 'Q') {
			int a, b; cin>>a>>b;
			q.push_back({a, b, i});
		} if(c == 'C'){
			cin>>ver[i];
			qq[ver[i]].push_back(i);
			q.push_back({-1, ver[i], i});
		}
	}
	
	par[1][0] = 1;
	dfs(1);
	dec(1);
	
	for(auto [a, b, t] : q){
		if(~a){
			if(check(a, b, t)) cout<<"yes\n";
			else cout<<"no\n";
		} else { 
			cout<<++res[t]<<"\n";
		}
	}
}

/*

6 3
S 1 2
S 1 3
S 3 4
Q 5 1
S 4 5
S 1 6
Q 5 1
Q 1 5

5 1
S 5 4
S 4 1
S 1 2
S 2 3
Q 3 5

*/
# Verdict Execution time Memory Grader output
1 Correct 42 ms 21568 KB Output is correct
2 Correct 54 ms 22480 KB Output is correct
3 Correct 45 ms 22736 KB Output is correct
4 Correct 59 ms 22620 KB Output is correct
5 Correct 54 ms 22500 KB Output is correct
6 Correct 44 ms 22372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 42 ms 21568 KB Output is correct
2 Correct 54 ms 22480 KB Output is correct
3 Correct 45 ms 22736 KB Output is correct
4 Correct 59 ms 22620 KB Output is correct
5 Correct 54 ms 22500 KB Output is correct
6 Correct 44 ms 22372 KB Output is correct
7 Incorrect 45 ms 22000 KB Extra information in the output file
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 37 ms 21524 KB Output is correct
2 Correct 148 ms 50344 KB Output is correct
3 Correct 134 ms 50404 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 21524 KB Output is correct
2 Correct 148 ms 50344 KB Output is correct
3 Correct 134 ms 50404 KB Output is correct
4 Incorrect 39 ms 21996 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 36 ms 21540 KB Output is correct
2 Correct 342 ms 57864 KB Output is correct
3 Correct 311 ms 57828 KB Output is correct
4 Correct 250 ms 58384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 36 ms 21540 KB Output is correct
2 Correct 342 ms 57864 KB Output is correct
3 Correct 311 ms 57828 KB Output is correct
4 Correct 250 ms 58384 KB Output is correct
5 Incorrect 39 ms 22016 KB Extra information in the output file
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 38 ms 21504 KB Output is correct
2 Correct 205 ms 49620 KB Output is correct
3 Correct 237 ms 49904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 21504 KB Output is correct
2 Correct 205 ms 49620 KB Output is correct
3 Correct 237 ms 49904 KB Output is correct
4 Incorrect 40 ms 21956 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 46 ms 21476 KB Output is correct
2 Correct 328 ms 57920 KB Output is correct
3 Correct 299 ms 57940 KB Output is correct
4 Correct 269 ms 58460 KB Output is correct
5 Correct 38 ms 21512 KB Output is correct
6 Correct 188 ms 49676 KB Output is correct
7 Correct 235 ms 49896 KB Output is correct
8 Correct 296 ms 49772 KB Output is correct
9 Correct 295 ms 50380 KB Output is correct
10 Correct 330 ms 55000 KB Output is correct
11 Correct 355 ms 53844 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 46 ms 21476 KB Output is correct
2 Correct 328 ms 57920 KB Output is correct
3 Correct 299 ms 57940 KB Output is correct
4 Correct 269 ms 58460 KB Output is correct
5 Correct 38 ms 21512 KB Output is correct
6 Correct 188 ms 49676 KB Output is correct
7 Correct 235 ms 49896 KB Output is correct
8 Correct 296 ms 49772 KB Output is correct
9 Correct 295 ms 50380 KB Output is correct
10 Correct 330 ms 55000 KB Output is correct
11 Correct 355 ms 53844 KB Output is correct
12 Incorrect 38 ms 22076 KB Extra information in the output file
13 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 39 ms 21536 KB Output is correct
2 Correct 51 ms 22620 KB Output is correct
3 Correct 45 ms 22688 KB Output is correct
4 Correct 58 ms 22616 KB Output is correct
5 Correct 56 ms 22540 KB Output is correct
6 Correct 43 ms 22372 KB Output is correct
7 Correct 36 ms 21552 KB Output is correct
8 Correct 152 ms 50420 KB Output is correct
9 Correct 143 ms 50412 KB Output is correct
10 Correct 39 ms 21524 KB Output is correct
11 Correct 294 ms 57856 KB Output is correct
12 Correct 312 ms 57812 KB Output is correct
13 Correct 228 ms 58412 KB Output is correct
14 Correct 37 ms 21432 KB Output is correct
15 Correct 191 ms 49680 KB Output is correct
16 Correct 227 ms 49876 KB Output is correct
17 Correct 303 ms 49984 KB Output is correct
18 Correct 292 ms 50320 KB Output is correct
19 Correct 345 ms 54908 KB Output is correct
20 Correct 365 ms 53892 KB Output is correct
21 Correct 153 ms 50384 KB Output is correct
22 Correct 162 ms 50092 KB Output is correct
23 Correct 223 ms 49888 KB Output is correct
24 Correct 210 ms 49920 KB Output is correct
25 Correct 428 ms 55072 KB Output is correct
26 Correct 276 ms 49280 KB Output is correct
27 Correct 289 ms 49380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 39 ms 21536 KB Output is correct
2 Correct 51 ms 22620 KB Output is correct
3 Correct 45 ms 22688 KB Output is correct
4 Correct 58 ms 22616 KB Output is correct
5 Correct 56 ms 22540 KB Output is correct
6 Correct 43 ms 22372 KB Output is correct
7 Correct 36 ms 21552 KB Output is correct
8 Correct 152 ms 50420 KB Output is correct
9 Correct 143 ms 50412 KB Output is correct
10 Correct 39 ms 21524 KB Output is correct
11 Correct 294 ms 57856 KB Output is correct
12 Correct 312 ms 57812 KB Output is correct
13 Correct 228 ms 58412 KB Output is correct
14 Correct 37 ms 21432 KB Output is correct
15 Correct 191 ms 49680 KB Output is correct
16 Correct 227 ms 49876 KB Output is correct
17 Correct 303 ms 49984 KB Output is correct
18 Correct 292 ms 50320 KB Output is correct
19 Correct 345 ms 54908 KB Output is correct
20 Correct 365 ms 53892 KB Output is correct
21 Correct 153 ms 50384 KB Output is correct
22 Correct 162 ms 50092 KB Output is correct
23 Correct 223 ms 49888 KB Output is correct
24 Correct 210 ms 49920 KB Output is correct
25 Correct 428 ms 55072 KB Output is correct
26 Correct 276 ms 49280 KB Output is correct
27 Correct 289 ms 49380 KB Output is correct
28 Incorrect 44 ms 21948 KB Extra information in the output file
29 Halted 0 ms 0 KB -