社区讨论
一个玄学的事情
P3950部落冲突参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lvz78art
- 此快照首次捕获于
- 2024/05/09 20:02 2 年前
- 此快照最后确认于
- 2024/05/09 21:32 2 年前
树只有 条边,但我试图输入 条边,却发现能过样例,交上去只有
CPP#1,#9 出现了 TLE,其他都 AC,不知道那是因为什么导致的。#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 条回复,欢迎继续交流。
正在加载回复...