제출 #1319285

#제출 시각아이디문제언어결과실행 시간메모리
1319285Jawad_Akbar_JJInside information (BOI21_servers)C++20
0 / 100
43 ms5708 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 120005, K = 20;
vector<pair<int, int>> nei[N];
vector<int> Par[N], pr[N], id[N], inc[N], des[N], Mx[N], Mn[N];
int ch[N], dead[N], a[N<<1], b[N<<1];
char t[N<<1];

struct fwTree{
	vector<int> ds;
	int n;

	void init(int sz){
		n = sz;
		ds.resize(n + 1, 0);
	}

	void Add(int i){
		for (; i; i -= i & -i)
			ds[i]++;
	}

	int get(int i, int ans){
		for (; i <= n; i += i & -i)
			ans += ds[i];
		return ans;
	}
} ft[N];

void dfs1(int u, int p){
	ch[u] = 1;
	for (auto [i, j] : nei[u])
		if (i != p and !dead[p])
			dfs1(i, u), ch[u] += ch[i];
}

int cent(int u, int p, int sz){
	for (auto [i, j] : nei[u]){
		if (i != p and !dead[i] and ch[i] * 2 >= sz)
			return cent(i, u, sz);
	}
	return u;
}

void dfsColor(int u, int p, int ic, int dc, int i2, int mx, int mn){
	inc[u].push_back(!!ic);
	des[u].push_back(!!dc);
	id[u].push_back(i2);
	Par[u].push_back(Par[p].back());
	pr[u].push_back(p);
	Mx[u].push_back(mx);
	Mn[u].push_back(mn);


	for (auto [i, j] : nei[u]){
		if (dead[i] or i == p)
			continue;
		int ic1 = ((j > ic and ic != 0) ? j : 0), dc1 = (j < dc ? j : 0);
		dfsColor(i, u, ic1, dc1, i2, max(mx, j), min(mn, j));
	}
}

void decomp(int u, int cid = 0){
	dfs1(u, -1);
	u = cent(u, -1, ch[u]);

	vector<pair<int, int>> vc;
	for (auto [i, j] : nei[u]){
		if (!dead[i])
			vc.push_back({j, i});
	}
	sort(begin(vc), end(vc));

	inc[u].push_back(1);
	des[u].push_back(1);
	id[u].push_back(0);
	Par[u].push_back(u);
	pr[u].push_back(-1);
	Mx[u].push_back(0);
	Mn[u].push_back(N + N);

	for (auto [j, i] : vc)
		dfsColor(i, u, j, j, ++cid, j, j);	
	ft[u].init(cid);
	dead[u] = 1;

	for (auto [j, i] : vc)
		decomp(i);
}

int main(){
	int n, k;
	cin>>n>>k, k--;

	for (int i=1;i<=n+k;i++){
		cin>>t[i]>>a[i];
		if (t[i] != 'C')
			cin>>b[i];
		
		if (t[i] == 'S'){
			nei[a[i]].push_back({b[i], i});
			nei[b[i]].push_back({a[i], i});
		}
	}

	decomp(1);


	for (int i=1;i<=n+k;i++){
		int u = a[i], v = b[i];
		if (t[i] == 'S'){
			for (int j=0;j < min(Par[u].size(), Par[v].size()) and Par[u][j] == Par[v][j];j++){
				int cr = v;
				if (pr[u][j] == cr)
					cr = u;
				if (inc[cr][j])
					ft[Par[cr][j]].Add(id[cr][j]);
			}
		}
		else if (t[i] == 'Q'){
			int j = 0;
			while (j + 1 < min(Par[u].size(), Par[v].size()) and Par[u][j+1] == Par[v][j+1])
				j++;
			if (des[v][j] and inc[u][j] and Mx[v][j] < Mn[u][j] and Mx[u][j] < i)
				cout<<"yes\n";
			else
				cout<<"no\n";
		}
		else{
			int Ans = 0;
			for (int j=0;j<Par[u].size();j++){
				if (des[u][j] and Mx[u][j] <= i)
					Ans += ft[Par[u][j]].get(id[u][j] + 1, 0) + 1;
			}
			cout<<Ans<<'\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...