题目链接:https://vjudge.net/problem/Aizu-2170
题意:给一棵树,完成两个操作:给一些点打标记,或询问每个最近的有标记的祖先
这题?一开始想有什么好方法脑补了好久,原来直接暴力找祖先就没了。这能算并查集吗,虽然白书把它放到并查集了,硬要算的话就是不带路径压缩的(显然不能路径压缩)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
int m[maxn],par[maxn];
int n,i,j,q,v;
int find(int x){ return (par[x]==x)?x:find(par[x]);} //没有路径压缩
int main(){
scanf("%d%d",&n,&q);
while (n!=0&&q!=0){
ll ans=0; par[1]=1;
for (i=2;i<=n;i++) scanf("%d",&par[i]);
for (i=1;i<=q;i++){
char ch; getchar();
scanf("%c %d",&ch,&v);
if (ch=='M') par[v]=v; else ans+=find(v);
}
printf("%lld
",ans);
scanf("%d%d",&n,&q);
}
return 0;
}