Submission #817878

# Submission time Handle Problem Language Result Execution time Memory
817878 2023-08-09T18:32:43 Z MohamedAhmed04 Inside information (BOI21_servers) C++14
70 / 100
3500 ms 49204 KB
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

using namespace std ;

const int MAX = 3e5 + 10 ;
const int B = 600 ;

int n , q ;

vector< vector< pair<int , int> > >adj(MAX) ;
vector< vector<int> >adj2(MAX) ;

int val[MAX] , up_inc[MAX] , up_dec[MAX] ;
int dep[MAX] , P[MAX][18] ;

int in[MAX] , out[MAX] ;
int tim = 0 ;

vector<int>order ;

void dfs(int node , int par)
{
	in[node] = ++tim , order.push_back(node) ;
	P[node][0] = par ;
	for(int i = 1 ; i < 18 ; ++i)
		P[node][i] = P[P[node][i-1]][i-1] ;
	up_inc[node] = up_dec[node] = par ;
	if(val[node] < val[par])
		up_inc[node] = up_inc[par] ;
	else
		up_dec[node] = up_dec[par] ;
	for(auto &childd : adj[node])
	{
		int child = childd.first , y = childd.second ;
		if(child == par)
			continue ;
		dep[child] = dep[node] + 1 , val[child] = y ;
		dfs(child , node) ;
	}
	out[node] = tim ;
}

bool Ancestor(int x , int y)
{
	return (in[y] >= in[x] && in[y] <= out[x]) ;
}

bool check(int x , int y , int tim) // x has server y
{
	if(x == y)
		return true ;
	if((!Ancestor(up_inc[y] , x)))
		return false ;
	if((!Ancestor(up_dec[x] , y)))
		return false ;
	if(Ancestor(y , x))
		return (val[x] <= tim) ;
	if((!Ancestor(x , y)) && val[x] > tim)
		return false ;
	bool flag = false ;
	if(dep[x] < dep[y])
		swap(x , y) , flag = true ;
	for(int k = 17 ; k >= 0 ; --k)
	{
		if(dep[x] - (1 << k) > dep[y])
			x = P[x][k] ;
	}
	if(P[x][0] == y)
		return (val[x] <= tim) ;
	if(dep[x] != dep[y])
		x = P[x][0] ;
	if(flag)
		swap(x , y) ;
	for(int k = 17 ; k >= 0 ; --k)
	{
		if(P[x][k] != P[y][k])
			x = P[x][k] , y = P[y][k] ;
	}
	return (val[x] > val[y]) ;
}

int dp[MAX] , dpup[MAX] , dpdown[MAX] ;
int vis[MAX] ;

void dfs2(int node , int par)
{
	vis[node] = 1 ;
	dpdown[node] = dp[node] = 1 ;
	for(auto &child : adj2[node])
	{
		if(child == par)
			continue ;
		dfs2(child , node) ;
		if(val[child] > val[node])
			dpdown[node] += dpdown[child] ;
		dp[node] += dpdown[child] ;
	}
}

void dfs3(int node , int par , int sum)
{
	dpup[node] = sum + (par != node) ;
	if(val[par] > val[node])
		dpup[node] += dpup[par] ;
	dp[node] += dpup[node] ;
	int sz = adj2[node].size() , sum2 = 0 ;
	for(int i = sz-1 ; i >= 0 ; --i)
	{
		int child = adj2[node][i] ;
		if(child == par)
			continue ;
		dfs3(child , node , sum2) ;
		sum2 += dpdown[child] ;
	}
}

void calc()
{
	for(int i = 1 ; i <= n ; ++i)
		vis[i] = 0 ;
	for(auto &node : order)
	{
		if(vis[node])
			continue ;
		dfs2(node , node) ;
		dfs3(node , node , 0) ;
	}
}

char ch[MAX] ;
int X[MAX] , Y[MAX] ;

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>q ;
	for(int i = 1 ; i <= n+q-1 ; ++i)
	{
		cin>>ch[i] ;
		if(ch[i] == 'S')
		{
			cin>>X[i]>>Y[i] ;
			adj[X[i]].emplace_back(Y[i] , i) ;
			adj[Y[i]].emplace_back(X[i] , i) ;
		}
		else if(ch[i] == 'Q')
			cin>>X[i]>>Y[i] ;
		else if(ch[i] == 'C')
			cin>>X[i] ;
	}
	dfs(1 , 1) ;
	for(int i = 1 ; i <= n ; ++i)
		dp[i] = 1 ;
	int cnt = 0 ;
	vector<int>v ;
	for(int i = 1 ; i <= n+q-1 ; ++i)
	{
		if(cnt == B)
			calc() , cnt = 0 , v.clear() ;
		if(ch[i] == 'S')
		{
			v.push_back(i) ;
			adj2[X[i]].push_back(Y[i]) ;
			adj2[Y[i]].push_back(X[i]) ;
			cnt++ ;
		}
		else if(ch[i] == 'Q')
		{
			if(check(X[i] , Y[i] , i))
				cout<<"yes\n" ;
			else
				cout<<"no\n" ;
		}
		else if(ch[i] == 'C')
		{
			int ans = dp[X[i]] ;
			for(auto &j : v)
			{
				int a = X[j] , b = Y[j] ;
				if(val[a] != j)
					swap(a , b) ;
				if(check(a , X[i] , i) && (!Ancestor(a , X[i])))
					ans++ ;
				else if(check(b , X[i] , i) && Ancestor(a , X[i]))
					ans++ ;
			}
			cout<<ans<<"\n" ;
		}
	}
	return 0 ;
}
# Verdict Execution time Memory Grader output
1 Correct 23 ms 15872 KB Output is correct
2 Correct 43 ms 16592 KB Output is correct
3 Correct 29 ms 16728 KB Output is correct
4 Correct 28 ms 16684 KB Output is correct
5 Correct 29 ms 16944 KB Output is correct
6 Correct 30 ms 16708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 15872 KB Output is correct
2 Correct 43 ms 16592 KB Output is correct
3 Correct 29 ms 16728 KB Output is correct
4 Correct 28 ms 16684 KB Output is correct
5 Correct 29 ms 16944 KB Output is correct
6 Correct 30 ms 16708 KB Output is correct
7 Correct 30 ms 15900 KB Output is correct
8 Correct 206 ms 16524 KB Output is correct
9 Correct 481 ms 16688 KB Output is correct
10 Correct 231 ms 16584 KB Output is correct
11 Correct 225 ms 16880 KB Output is correct
12 Correct 1000 ms 16788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 15952 KB Output is correct
2 Correct 761 ms 39564 KB Output is correct
3 Correct 532 ms 39532 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 15952 KB Output is correct
2 Correct 761 ms 39564 KB Output is correct
3 Correct 532 ms 39532 KB Output is correct
4 Correct 35 ms 15936 KB Output is correct
5 Correct 1043 ms 39512 KB Output is correct
6 Correct 883 ms 39820 KB Output is correct
7 Correct 1923 ms 39676 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 32 ms 15828 KB Output is correct
2 Correct 651 ms 47544 KB Output is correct
3 Correct 734 ms 47504 KB Output is correct
4 Correct 578 ms 49204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 32 ms 15828 KB Output is correct
2 Correct 651 ms 47544 KB Output is correct
3 Correct 734 ms 47504 KB Output is correct
4 Correct 578 ms 49204 KB Output is correct
5 Correct 24 ms 15860 KB Output is correct
6 Correct 979 ms 47420 KB Output is correct
7 Correct 1457 ms 47692 KB Output is correct
8 Correct 1259 ms 47332 KB Output is correct
9 Correct 1126 ms 47360 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 15912 KB Output is correct
2 Correct 398 ms 39052 KB Output is correct
3 Correct 1002 ms 39156 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 15912 KB Output is correct
2 Correct 398 ms 39052 KB Output is correct
3 Correct 1002 ms 39156 KB Output is correct
4 Correct 29 ms 15828 KB Output is correct
5 Correct 1022 ms 39124 KB Output is correct
6 Correct 1259 ms 39008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 15816 KB Output is correct
2 Correct 705 ms 47644 KB Output is correct
3 Correct 816 ms 47492 KB Output is correct
4 Correct 685 ms 49100 KB Output is correct
5 Correct 22 ms 15828 KB Output is correct
6 Correct 426 ms 39100 KB Output is correct
7 Correct 1020 ms 39256 KB Output is correct
8 Correct 928 ms 40296 KB Output is correct
9 Correct 1200 ms 40420 KB Output is correct
10 Correct 2471 ms 42568 KB Output is correct
11 Correct 2005 ms 42188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 15816 KB Output is correct
2 Correct 705 ms 47644 KB Output is correct
3 Correct 816 ms 47492 KB Output is correct
4 Correct 685 ms 49100 KB Output is correct
5 Correct 22 ms 15828 KB Output is correct
6 Correct 426 ms 39100 KB Output is correct
7 Correct 1020 ms 39256 KB Output is correct
8 Correct 928 ms 40296 KB Output is correct
9 Correct 1200 ms 40420 KB Output is correct
10 Correct 2471 ms 42568 KB Output is correct
11 Correct 2005 ms 42188 KB Output is correct
12 Correct 24 ms 15828 KB Output is correct
13 Correct 899 ms 47444 KB Output is correct
14 Correct 1375 ms 47788 KB Output is correct
15 Correct 1403 ms 47340 KB Output is correct
16 Correct 1267 ms 47292 KB Output is correct
17 Correct 27 ms 15828 KB Output is correct
18 Correct 1040 ms 39052 KB Output is correct
19 Correct 934 ms 38996 KB Output is correct
20 Correct 1301 ms 40328 KB Output is correct
21 Correct 1401 ms 40340 KB Output is correct
22 Execution timed out 3572 ms 41540 KB Time limit exceeded
23 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 27 ms 15828 KB Output is correct
2 Correct 40 ms 16664 KB Output is correct
3 Correct 30 ms 16668 KB Output is correct
4 Correct 28 ms 16752 KB Output is correct
5 Correct 32 ms 16956 KB Output is correct
6 Correct 42 ms 16720 KB Output is correct
7 Correct 23 ms 15848 KB Output is correct
8 Correct 1055 ms 39508 KB Output is correct
9 Correct 601 ms 39528 KB Output is correct
10 Correct 29 ms 15808 KB Output is correct
11 Correct 774 ms 47552 KB Output is correct
12 Correct 634 ms 47500 KB Output is correct
13 Correct 699 ms 49192 KB Output is correct
14 Correct 21 ms 15828 KB Output is correct
15 Correct 418 ms 39048 KB Output is correct
16 Correct 1076 ms 39228 KB Output is correct
17 Correct 1219 ms 40372 KB Output is correct
18 Correct 946 ms 40360 KB Output is correct
19 Correct 3065 ms 42532 KB Output is correct
20 Correct 2513 ms 42140 KB Output is correct
21 Correct 743 ms 39548 KB Output is correct
22 Correct 792 ms 39484 KB Output is correct
23 Correct 701 ms 40272 KB Output is correct
24 Correct 868 ms 40324 KB Output is correct
25 Correct 940 ms 41484 KB Output is correct
26 Correct 1000 ms 39120 KB Output is correct
27 Correct 888 ms 39148 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 15828 KB Output is correct
2 Correct 40 ms 16664 KB Output is correct
3 Correct 30 ms 16668 KB Output is correct
4 Correct 28 ms 16752 KB Output is correct
5 Correct 32 ms 16956 KB Output is correct
6 Correct 42 ms 16720 KB Output is correct
7 Correct 23 ms 15848 KB Output is correct
8 Correct 1055 ms 39508 KB Output is correct
9 Correct 601 ms 39528 KB Output is correct
10 Correct 29 ms 15808 KB Output is correct
11 Correct 774 ms 47552 KB Output is correct
12 Correct 634 ms 47500 KB Output is correct
13 Correct 699 ms 49192 KB Output is correct
14 Correct 21 ms 15828 KB Output is correct
15 Correct 418 ms 39048 KB Output is correct
16 Correct 1076 ms 39228 KB Output is correct
17 Correct 1219 ms 40372 KB Output is correct
18 Correct 946 ms 40360 KB Output is correct
19 Correct 3065 ms 42532 KB Output is correct
20 Correct 2513 ms 42140 KB Output is correct
21 Correct 743 ms 39548 KB Output is correct
22 Correct 792 ms 39484 KB Output is correct
23 Correct 701 ms 40272 KB Output is correct
24 Correct 868 ms 40324 KB Output is correct
25 Correct 940 ms 41484 KB Output is correct
26 Correct 1000 ms 39120 KB Output is correct
27 Correct 888 ms 39148 KB Output is correct
28 Correct 29 ms 15828 KB Output is correct
29 Correct 204 ms 16580 KB Output is correct
30 Correct 485 ms 16740 KB Output is correct
31 Correct 226 ms 16656 KB Output is correct
32 Correct 229 ms 16884 KB Output is correct
33 Correct 945 ms 16720 KB Output is correct
34 Correct 36 ms 15832 KB Output is correct
35 Correct 973 ms 39488 KB Output is correct
36 Correct 787 ms 39848 KB Output is correct
37 Correct 1875 ms 39660 KB Output is correct
38 Correct 23 ms 15820 KB Output is correct
39 Correct 889 ms 47524 KB Output is correct
40 Correct 1293 ms 47748 KB Output is correct
41 Correct 1092 ms 47428 KB Output is correct
42 Correct 1081 ms 47512 KB Output is correct
43 Correct 27 ms 15916 KB Output is correct
44 Correct 994 ms 39052 KB Output is correct
45 Correct 944 ms 38988 KB Output is correct
46 Correct 1308 ms 40316 KB Output is correct
47 Correct 1124 ms 40448 KB Output is correct
48 Execution timed out 3565 ms 41620 KB Time limit exceeded
49 Halted 0 ms 0 KB -