Cube Stack
Cube Stack
有一点lazy思想,设三个数组cnt代表它以下的有多少个元素(直到栈底),top[x]代表x所在栈的栈顶元素,dad[x]代表x所在栈的栈底元素,先寻找父亲,然后递归更新累加cnt,找父亲的时候更新cnt,对于一个元素,再用之前一定要找父亲,这样才会是真的cnt。
#include<iostream> #include<cstdio> using namespace std; int top[30010],cnt[30010],dad[30010]; int p; void Cin(int &x) { char c=getchar();x=0; while(c<'0'||c>'9')c=getchar(); while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(); } void Cout(int x) { if(x>9) Cout(x/10); putchar(x%10+'0'); } int getfather(int x) { if(dad[x]==x) return x; int f=dad[x]; dad[x]=getfather(dad[x]); cnt[x]+=cnt[f]; return dad[x]; } void merge(int x,int y) { int F=getfather(x); int f=getfather(y); if(F!=f) { dad[F]=f; int t=getfather(top[f]); cnt[F]=cnt[top[f]]+1; top[f]=top[F]; } } int main() { for(int i=1;i<=30010;i++) { dad[i]=i; top[i]=i; } cin>>p; char c; int x,y; for(int i=1;i<=p;i++) { cin>>c; if(c=='M') { Cin(x),Cin(y); merge(x,y); } else { cin>>x; int t=getfather(x); Cout(cnt[x]),putchar('\n'); } } return 0; }