bzoj2002 弹飞绵羊

本文介绍了一道LCT裸题的解决方法,重点在于通过反向建立边来维护向下路径,使用C++实现。文章包含完整的代码示例,展示了如何进行节点旋转、路径分裂等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LCT 裸题,技巧是反着建边才能维护向下路径

/**************************************************************
    Problem: 2002
    User: Clare
    Language: C++
    Result: Accepted
    Time:1884 ms
    Memory:6036 kb
****************************************************************/
 
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
 
#define N 200010
 
int n,m;
int size[N],fa[N],c[N][2],Next[N];
bool Rev[N];
stack<int> st;
 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
 
void Pushup(int k)
{
    int l=c[k][0],r=c[k][1];
    size[k]=size[l]+size[r]+1;
}
 
void Pushdown(int k)
{
    int l=c[k][0],r=c[k][1];
    if(Rev[k])
    {
        Rev[k]^=1;Rev[r]^=1;Rev[l]^=1;
        swap(c[k][0],c[k][1]);
    }
}
 
bool Pd_root(int k)
{
    return !(c[fa[k]][0]==k)&&!(c[fa[k]][1]==k);
}
 
void Rotate(int x)
{
    int y=fa[x],z=fa[y],l,r;
    if(c[y][0]==x)l=0;else l=1;
    r=l^1;
    if(Pd_root(y));
    else if(c[z][0]==y)c[z][0]=x;
    else c[z][1]=x;
    fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
    c[y][l]=c[x][r];c[x][r]=y;
    Pushup(y);Pushup(x);
}
 
void Splay(int x)
{
    st.push(x);
    for(int i=x;!Pd_root(i);i=fa[i])
    {
        st.push(fa[i]);
    }
    while(!st.empty())
    {
        int now=st.top();st.pop();
        Pushdown(now);
    }
    while(!Pd_root(x))
    {
        int y=fa[x],z=fa[y];
        if(!Pd_root(y))
        {
            if(c[y][0]==x^c[z][0]==y)
                Rotate(x);
            else Rotate(y);
        }
        Rotate(x);
    }
}
 
void Access(int x)
{
    for(int t=0;x;t=x,x=fa[x])
        Splay(x),c[x][1]=t,Pushup(x);
}
 
void Move_to_root(int x)
{
    Access(x);Splay(x);Rev[x]^=1;
}
 
void Join(int x,int y)
{
    Move_to_root(x);fa[x]=y;
}
 
void Cut(int x,int y)
{
    Move_to_root(x);Access(y);Splay(y);
    fa[x]=0;c[y][0]=0;
    Pushup(y);
}
 
void Split(int x,int y)
{
    Move_to_root(x);Access(y);Splay(y);
}
 
int main()
{
    n=read();
    for(int i=1;i<=n+1;i++)
        size[i]=1;
    for(int i=1;i<=n;i++)
    {
        int x=read();
        if(i+x>n)
            fa[i]=n+1,Next[i]=n+1;
        else fa[i]=i+x,Next[i]=i+x;
    }
    m=read();
    for(int i=1;i<=m;i++)
    {
        int kind=read();
        if(kind==1)
        {
            int x=read()+1;
            Move_to_root(n+1);Access(x);Splay(x);
            printf("%d\n",size[c[x][0]]);
        }
        else
        {
            int x=read()+1,y=read();
            if(x+y>n)
                y=n+1;
            else y=x+y;
            Cut(x,Next[x]);Join(x,y);
            Next[x]=y;
        }
    }
    return 0;
}


内容概要:本文深入探讨了DevOps流程落地中自动化测试与监控体系的构建,强调二者是保障软件质量和系统稳定性的重要支柱。自动化测试涵盖从单元测试到端到端测试的全流程自动化,而监控体系则通过实时采集和分析系统数据,及时发现并解决问题。文章介绍了测试金字塔模型的应用、监控指标的分层设计、测试与生产环境的一致性构建以及告警策略的精细化设置等核心技巧。此外,还提供了基于Python和Prometheus的具体代码案例,包括自动化接口测试脚本和监控指标暴露的实现,展示了如何在实际项目中应用这些技术和方法。 适合人群:对DevOps有一定了解,从事软件开发、运维或测试工作的技术人员,特别是那些希望提升自动化测试和监控能力的从业者。 使用场景及目标:①高并发业务系统中,模拟大规模用户请求,验证系统抗压能力和稳定性;②关键业务流程保障,确保金融交易、医疗数据处理等敏感业务的合规性和可追溯性;③微服务架构系统下,通过契约测试和分布式链路追踪,保证服务间的兼容性和故障快速定位。 阅读建议:本文不仅提供了理论指导,还有详细的代码示例,建议读者结合自身项目的实际情况,逐步实践文中提到的技术和方法,特别是在构建自动化测试框架和监控系统时,关注环境一致性、测试覆盖率和性能指标等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值