Submission #574220

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

#define ar array

const int N = 2e5 + 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){
	//~ cout<<u<<" "<<inc<<" "<<dec<<"\n";
	if(dec){
		tt.insert(tt.end(), qq[u].begin(), qq[u].end());
		for(auto x : qq[u]) 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);
	//~ cout<<u<<"\n";
	
	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'){
			int v; cin>>v;
			qq[v].push_back(i);
			ver[i] = v;
			q.push_back({-1, v, i});
		}
	}
	
	par[1][0] = 1;
	dfs(1);
	dec(1);
	//~ int cnt = 0;
	//~ function<void(int, int, int, int)> dfs = [&](int u, int t, int p, int ed){
		//~ cnt++;
		//~ for(auto x : edges[u]){
			//~ if(x[0] == p || x[1] > t || x[1] <= ed) continue;
			//~ dfs(x[0], t, u, x[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 35 ms 12664 KB Output is correct
2 Correct 51 ms 14240 KB Output is correct
3 Correct 43 ms 14508 KB Output is correct
4 Correct 66 ms 14420 KB Output is correct
5 Correct 58 ms 14284 KB Output is correct
6 Correct 46 ms 14076 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 35 ms 12664 KB Output is correct
2 Correct 51 ms 14240 KB Output is correct
3 Correct 43 ms 14508 KB Output is correct
4 Correct 66 ms 14420 KB Output is correct
5 Correct 58 ms 14284 KB Output is correct
6 Correct 46 ms 14076 KB Output is correct
7 Incorrect 46 ms 13204 KB Extra information in the output file
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 37 ms 12736 KB Output is correct
2 Correct 142 ms 43520 KB Output is correct
3 Correct 152 ms 43584 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 12736 KB Output is correct
2 Correct 142 ms 43520 KB Output is correct
3 Correct 152 ms 43584 KB Output is correct
4 Incorrect 34 ms 13188 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 37 ms 12656 KB Output is correct
2 Correct 364 ms 52492 KB Output is correct
3 Correct 351 ms 52340 KB Output is correct
4 Correct 234 ms 52840 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 12656 KB Output is correct
2 Correct 364 ms 52492 KB Output is correct
3 Correct 351 ms 52340 KB Output is correct
4 Correct 234 ms 52840 KB Output is correct
5 Incorrect 33 ms 13172 KB Extra information in the output file
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 34 ms 12668 KB Output is correct
2 Correct 197 ms 43292 KB Output is correct
3 Correct 231 ms 43536 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 34 ms 12668 KB Output is correct
2 Correct 197 ms 43292 KB Output is correct
3 Correct 231 ms 43536 KB Output is correct
4 Incorrect 35 ms 13140 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 32 ms 12756 KB Output is correct
2 Correct 327 ms 52576 KB Output is correct
3 Correct 370 ms 52432 KB Output is correct
4 Correct 227 ms 52860 KB Output is correct
5 Correct 33 ms 12724 KB Output is correct
6 Correct 218 ms 43208 KB Output is correct
7 Correct 233 ms 43644 KB Output is correct
8 Correct 370 ms 43460 KB Output is correct
9 Correct 315 ms 43840 KB Output is correct
10 Correct 385 ms 50292 KB Output is correct
11 Correct 391 ms 49920 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 32 ms 12756 KB Output is correct
2 Correct 327 ms 52576 KB Output is correct
3 Correct 370 ms 52432 KB Output is correct
4 Correct 227 ms 52860 KB Output is correct
5 Correct 33 ms 12724 KB Output is correct
6 Correct 218 ms 43208 KB Output is correct
7 Correct 233 ms 43644 KB Output is correct
8 Correct 370 ms 43460 KB Output is correct
9 Correct 315 ms 43840 KB Output is correct
10 Correct 385 ms 50292 KB Output is correct
11 Correct 391 ms 49920 KB Output is correct
12 Incorrect 33 ms 13232 KB Extra information in the output file
13 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 33 ms 12684 KB Output is correct
2 Correct 53 ms 14288 KB Output is correct
3 Correct 44 ms 14356 KB Output is correct
4 Correct 54 ms 14468 KB Output is correct
5 Correct 50 ms 14332 KB Output is correct
6 Correct 39 ms 14052 KB Output is correct
7 Correct 34 ms 12756 KB Output is correct
8 Correct 167 ms 43640 KB Output is correct
9 Correct 138 ms 43664 KB Output is correct
10 Correct 31 ms 12736 KB Output is correct
11 Correct 336 ms 52468 KB Output is correct
12 Correct 326 ms 52428 KB Output is correct
13 Correct 244 ms 52908 KB Output is correct
14 Correct 34 ms 12708 KB Output is correct
15 Correct 195 ms 43224 KB Output is correct
16 Correct 249 ms 43492 KB Output is correct
17 Correct 287 ms 43436 KB Output is correct
18 Correct 294 ms 43852 KB Output is correct
19 Correct 390 ms 50220 KB Output is correct
20 Correct 358 ms 49920 KB Output is correct
21 Correct 170 ms 43960 KB Output is correct
22 Correct 170 ms 43668 KB Output is correct
23 Correct 255 ms 43340 KB Output is correct
24 Correct 261 ms 43564 KB Output is correct
25 Correct 378 ms 53364 KB Output is correct
26 Correct 286 ms 42936 KB Output is correct
27 Correct 297 ms 43008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 33 ms 12684 KB Output is correct
2 Correct 53 ms 14288 KB Output is correct
3 Correct 44 ms 14356 KB Output is correct
4 Correct 54 ms 14468 KB Output is correct
5 Correct 50 ms 14332 KB Output is correct
6 Correct 39 ms 14052 KB Output is correct
7 Correct 34 ms 12756 KB Output is correct
8 Correct 167 ms 43640 KB Output is correct
9 Correct 138 ms 43664 KB Output is correct
10 Correct 31 ms 12736 KB Output is correct
11 Correct 336 ms 52468 KB Output is correct
12 Correct 326 ms 52428 KB Output is correct
13 Correct 244 ms 52908 KB Output is correct
14 Correct 34 ms 12708 KB Output is correct
15 Correct 195 ms 43224 KB Output is correct
16 Correct 249 ms 43492 KB Output is correct
17 Correct 287 ms 43436 KB Output is correct
18 Correct 294 ms 43852 KB Output is correct
19 Correct 390 ms 50220 KB Output is correct
20 Correct 358 ms 49920 KB Output is correct
21 Correct 170 ms 43960 KB Output is correct
22 Correct 170 ms 43668 KB Output is correct
23 Correct 255 ms 43340 KB Output is correct
24 Correct 261 ms 43564 KB Output is correct
25 Correct 378 ms 53364 KB Output is correct
26 Correct 286 ms 42936 KB Output is correct
27 Correct 297 ms 43008 KB Output is correct
28 Incorrect 34 ms 13124 KB Extra information in the output file
29 Halted 0 ms 0 KB -