zoukankan      html  css  js  c++  java
  • bzoj5192: [Usaco2018 Feb]New Barns

    不想写看zory大佬

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    int dep[110000];
    int f[110000][30],Bin[30];
    int LCA(int x,int y)
    {
        if(dep[x]<dep[y])swap(x,y);
        for(int i=20;i>=0;i--)
            if(dep[x]-dep[y]>=Bin[i])x=f[x][i];
        if(x==y)return x;
        for(int i=20;i>=0;i--)
            if(dep[x]>=Bin[i]&&f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
        return f[x][0];
    }
    int getdis(int x,int y)
    {
        return dep[x]+dep[y]-2*dep[LCA(x,y)];
    }
    int d1[110000],d2[110000];
    int rt[110000];
    
    char ss[10];
    int main()
    {
        Bin[0]=1;for(int i=1;i<=20;i++)Bin[i]=Bin[i-1]*2;
        
        int Q,cnt=0,x;
        scanf("%d",&Q);
        while(Q--)
        {
            scanf("%s%d",ss+1,&x);
            if(ss[1]=='B')
            {
                cnt++;
                if(x==-1)
                {
                    rt[cnt]=cnt;
                    d1[cnt]=d2[cnt]=cnt;
                    dep[cnt]=1;
                }
                else
                {
                    rt[cnt]=rt[x];
                    dep[cnt]=dep[x]+1;
                    f[cnt][0]=x;for(int i=1;Bin[i]<=dep[cnt];i++)f[cnt][i]=f[f[cnt][i-1]][i-1];
                    int dis=getdis(d1[rt[cnt]],d2[rt[cnt]]);
                    if(getdis(d1[rt[cnt]],cnt)>dis)d2[rt[cnt]]=cnt;
                    if(getdis(d2[rt[cnt]],cnt)>dis)d1[rt[cnt]]=cnt;
                }
            }
            else printf("%d
    ",max( getdis(x,d1[rt[x]]),getdis(x,d2[rt[x]]) ));
        }
        return 0;
    }
  • 相关阅读:
    nproc 查看系统可用处理单元数
    c++内存泄露的坑
    内存泄露脚本
    c++内存问题(转)
    tmp
    kprobe
    内存对齐算法
    正则
    P3261 [JLOI2015]城池攻占有趣的做法
    CF1620C BAString题解
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8683031.html
Copyright © 2011-2022 走看看