제출 #1356401

#제출 시각아이디문제언어결과실행 시간메모리
1356401namhhInside information (BOI21_servers)C++20
5 / 100
143 ms34424 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e5+5;
const int lg = 18;
int n,q,ans[N],bits[N],st[N][lg],h[N],par[N][2],sz[N],del[N],val[N];
vector<pii>adj[N],qr2[N];
vector<tuple<int,int,int>>qr1[N];
vector<int>upd,full;
bool cmp(pii a, pii b){
	return a.se > b.se;
}
void update(int u, int val){
	while(u <= n){
		bits[u] += val;
		u += u & (-u);
	}
}
int get(int u){
	int res = 0;
	while(u > 0){
		res += bits[u];
		u -= u & (-u);
	}
	return res;
}
void dfs(int u, int p, int cur1, int cur2){
	h[u] = h[p]+1;
	st[u][0] = p;
	for(int i = 1; i < lg; i++) st[u][i] = st[st[u][i-1]][i-1];
	for(auto[v,w]: adj[u]){
		if(v != p){
			if(cur1 > w) par[v][0] = par[u][0];
			else par[v][0] = u;
			if(cur2 < w) par[v][1] = par[u][1];
			else par[v][1] = u;
			val[v] = w;
			dfs(v,u,w,w);
		}
	}
}
int lca(int u, int v){
	if(h[u] < h[v]) swap(u,v);
	for(int i = lg-1; i >= 0; i--){
		if(h[st[u][i]] >= h[v]){
			u = st[u][i];
		}
	}
	if(u == v) return u;
	for(int i = lg-1; i >= 0; i--){
		if(st[u][i] != st[v][i]){
			u = st[u][i];
			v = st[v][i];
		}
	}
	return st[u][0];
}
int cal(int u, int p){
	sz[u] = 1;
	for(auto[v,w]: adj[u]){
		if(v != p && !del[v]) sz[u] += cal(v,u);
	}
	return sz[u];
}
int find_cent(int u, int p, int tot){
	for(auto[v,w]: adj[u]){
		if(v != p && !del[v] && sz[v] > tot/2) return find_cent(v,u,tot);
	}
	return u;
}
int cur;
void missu(int u, int p, int c, bool tang, bool giam){
	if(tang){
	    upd.push_back(c);
	    full.push_back(c);
	}
	if(giam){
		for(auto[id,t]: qr2[u]){
		    ans[id] += get(t);
		    if(cur <= t) ans[id]++;
		}
	}
	for(auto[v,w]: adj[u]){
		if(v != p && !del[v]){
			int ngiam = giam;
			int ntang = tang;
			if(c < w) ngiam = false;
			if(c > w) ntang = false;
			missu(v,u,w,ntang,ngiam);
		}
	}
}
void decompose(int u){
	int cent = find_cent(u,0,cal(u,0));
	del[cent] = true;
	sort(adj[cent].begin(),adj[cent].end(),cmp);
	for(auto[v,w]: adj[cent]){
		if(!del[v]){
			cur = w;
		    missu(v,u,w,1,1);
		    for(auto it: upd) update(it,1);
		    upd.clear();
		}
	}
	for(auto[id,t]: qr2[cent]){
	    ans[id] += get(t);
	}
	for(auto it: full) update(it,-1);
	full.clear();
	for(auto[v,w]: adj[cent]){
		if(!del[v]) decompose(v);
	}
}
int jump(int u, int v){
	for(int i = lg-1; i >= 0; i--){
		if(h[st[u][i]] > h[v]) u = st[u][i];
	}
	return u;
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> q;
	int time = 0;
	int qr = 0;
	for(int i = 1; i <= n+q-1; i++){
		char x;
		cin >> x;
		if(x == 'S'){
			int u,v;
			cin >> u >> v;
			time++;
			adj[u].push_back({v,time});
			adj[v].push_back({u,time});
		}
		else if(x == 'Q'){
			int a,d;
			cin >> a >> d;
			qr++;
			qr1[d].push_back({qr,a,time});
		}
		else{
			int u;
			cin >> u;
			qr++;
			qr2[u].push_back({qr,time});
		}
	}
	par[1][0] = par[1][1] = 1;
	dfs(1,0,0,1e9);
	decompose(1);
	for(int i = 1; i <= n; i++){
		for(auto[id,a,time]: qr1[i]){
			int cc = lca(i,a);
			if(cc == i){
				int x = par[a][1];
				int v1 = val[a];
				if(h[x] <= h[cc] && v1 <= time) ans[id] = -1;
				else ans[id] = -2;
			}
			else if(cc == a){
				int y = par[i][0];
				int v2 = val[jump(i,a)];
				if(h[y] <= h[cc] && v2 <= time) ans[id] = -1;
				else ans[id] = -2;
			}
			else{
				int x = par[i][0];
				int y = par[a][1];
				int v1 = jump(i,cc);
				int v2 = jump(a,cc);
				if(h[x] <= h[cc] && h[y] <= h[cc] && val[v1] < val[v2] && val[a] <= time) ans[id] = -1;
			    else ans[id] = -2;
			}
		}
	}
	for(int i = 1; i <= q; i++){
		if(ans[i] == -1) cout << "yes" << "\n";
		else if(ans[i] == -2) cout << "no" << "\n";
		else cout << ans[i]+1 << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...