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; }