aoj2170 Marked Ancestor

题目链接: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\n",ans);
      scanf("%d%d",&n,&q);
	}
	return 0;
}

  

posted @ 2020-08-11 16:48  coastal_taipan  阅读(123)  评论(0编辑  收藏  举报