社区讨论

一个玄学的事情

P3950部落冲突参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lvz78art
此快照首次捕获于
2024/05/09 20:02
2 年前
此快照最后确认于
2024/05/09 21:32
2 年前
查看原帖
树只有 n1n - 1 条边,但我试图输入 nn 条边,却发现能过样例,交上去只有 #1,#9 出现了 TLE,其他都 AC,不知道那是因为什么导致的。
CPP
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,u,v;
int bl[300005],fa[300005],dep[300005],top[300005],sz[300005],in[300005],ot[300005],BIT[600005],cnt,cts;
vector<int>e[300005];
void srh1(int v){
	dep[v] = dep[fa[v]] + 1;
	sz[v] = 1;
	top[v] = v;
	for(int i = 0; i < e[v].size(); i ++){
		if(e[v][i] == fa[v]){
			swap(e[v][i],e[v][e[v].size() - 1]);
			e[v].pop_back();
			if(e[v].size() == i)
				break;
		}
		fa[e[v][i]] = v;
		srh1(e[v][i]);
		sz[v] += sz[e[v][i]];
	}
	int u = 0;
	for(int i = 1; i < e[v].size(); i ++){
		if(sz[e[v][i]] > sz[e[v][u]]){
			u = i;
		}
	}
	swap(e[v][u],e[v][0]);
}
void srh2(int v){
	in[v] = ++cnt;
	if(e[v].size() == 0){
		ot[v] = ++cnt;
		return;
	}
	top[e[v][0]] = top[v];
	srh2(e[v][0]);
	for(int i = 1; i < e[v].size(); i ++){
		srh2(e[v][i]);
	}
	ot[v] = ++cnt;
}
int lca(int u,int v){
	while(top[u] != top[v]){
		if(dep[top[u]] < dep[top[v]]){
			swap(u,v);
		}
		u = fa[top[u]];
	}
	if(dep[u] > dep[v])
		swap(u,v);
	return u;
}
void change(int pl,int val){
	for(int i = pl; i <= cnt; i += i & (-i)){
		BIT[i] += val;
	}
}
int query(int pl){
	int ans = 0;
	for(int i = pl; i > 0; i = i & (i - 1)){
		ans += BIT[i];
	}
	return ans;
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i = 1; i <= n; i ++){
		scanf("%d %d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	srh1(1);
	srh2(1);
	for(int i = 1; i <= m; i ++){
		char op;
		scanf(" %c %d",&op,&u);
		if(op == 'Q'){
			scanf("%d",&v);
			int o = lca(u,v);
			int p = query(in[o]);
			if(query(in[u]) > p || query(in[v]) > p){
				printf("No\n");
			}
			else{
				printf("Yes\n");
			}
		}
		else if(op == 'C'){
			scanf("%d",&v);
			if(u == fa[v])
				swap(u,v);
			change(in[u],1);
			change(ot[u],-1);
			bl[++cts] = u;
		}
		else {
			int p = bl[u];
			change(in[p],-1);
			change(ot[p],1);
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...