P3203 [HNOI2010]弹飞绵羊(LCT)

弹飞绵羊

题目传送门

解题思路

LCT。

将每个节点的权值设为\(1\),连接\(i\)\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\)。从\(j\)弹飞需要的次数就是\(split(j,n)\)后,\(sum[i]-1\)的值。修改弹力系数,即为断开\(i\)和旧的\(i+ki\)的连接,然后连上\(i\)和新的\(i+ki\)

为了方便,以下代码把下标都加一了,即原编号变为\(1-n\),弹飞设为\(n+1\)

代码如下

#include <bits/stdc++.h>

using namespace std;

const int N = 200005;

int fa[N], ch[N][2], siz[N], rev[N], sta[N], v[N];

inline bool get(int x)
{
    return ch[fa[x]][1] == x;
}

inline bool isroot(int x)
{
    return (!fa[x] || ch[fa[x]][1] != x && ch[fa[x]][0] != x);
}

inline void push_up(int x)
{
    siz[x] = siz[ch[x][1]] + siz[ch[x][0]] + 1;
}

inline void rotate(int x)
{
    int y = fa[x], z = fa[y];
    bool u = get(x);
    ch[y][u] = ch[x][u^1], fa[ch[x][u^1]] = y;
    if(!isroot(y))
        ch[z][get(y)] = x;
    fa[x] = z;
    ch[x][u^1] = y, fa[y] = x;
    push_up(y), push_up(x);
}

inline void pushr(int x)
{
    swap(ch[x][1], ch[x][0]);
    rev[x] ^= 1;
}

inline void push_down(int x)
{
    if(rev[x]){
        pushr(ch[x][0]), pushr(ch[x][1]);
        rev[x] = 0;
    }
}

inline void splay(int x)
{
    int pos = 0;
    sta[++pos] = x;
    for(int i = x; !isroot(i); i = fa[i])
        sta[++pos] = fa[i];
    while(pos)
        push_down(sta[pos--]);
    while(!isroot(x)){
        int y = fa[x];
        if(!isroot(y))
            get(x) == get(y) ? rotate(y): rotate(x);
        rotate(x);
    }
}

inline void access(int x)
{
    for(int y = 0; x; y = x, x = fa[x])
        splay(x), ch[x][1] = y, push_up(x);
}

inline void make_root(int x)
{
    access(x); splay(x);
    pushr(x);
}

inline void split(int x, int y)
{
    make_root(x);
    access(y);splay(y);
}

inline void link(int x, int y)
{
    make_root(x);
    fa[x] = y;
}

inline void cut(int x, int y)
{
    split(x, y);
    fa[x] = ch[y][0] = 0;
    push_up(y);
}

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++){
        scanf("%d", &v[i]);
        siz[i] = 1;
    }
    siz[n + 1] = 1;
    for(int i = 1; i <= n; i ++){
        if(i + v[i] <= n)
            link(i, i + v[i]);
        else
            link(i, n + 1);
    }
    int m;
    scanf("%d", &m);
    for(int i = 1; i <= m; i ++){
        int opt, x;
        scanf("%d%d", &opt, &x);
        ++x;
        if(opt == 1){
            split(n + 1, x);
            printf("%d\n", siz[x] - 1);
        }
        else {
            int k;
            scanf("%d", &k);
            if(x + v[x] <= n)
                cut(x, x + v[x]);
            else
                cut(x, n + 1);
            if(x + k <= n)
                link(x, x + k);
            else
                link(x, n + 1);
            v[x] = k;
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/whisperlzw/p/11404163.html

内容概要:本文档主要介绍了Intel Edge Peak (EP) 解决方案,涵盖从零到边缘高峰的软件配置和服务管理。EP解决方案旨在简化客户的入门门槛,提供一系列工具和服务,包括Edge Software Provisioner (ESP),用于构建和缓存操作系统镜像和软件栈;Device Management System (DMS),用于远程集群或本地集群管理;以及Autonomous Clustering for the Edge (ACE),用于自动化边缘集群的创建和管理。文档详细描述了从软件发布、设备制造、运输、安装到最终设备激活的全过程,并强调了在不同应用场景(如公共设施、工业厂房、海上油井和移动医院)下的具体部署步骤和技术细节。此外,文档还探讨了安全设备注册(FDO)、集群管理、密钥轮换和备份等关键操作。 适合人群:具备一定IT基础设施和边缘计算基础知识的技术人员,特别是负责边缘设备部署和管理的系统集成商和运维人员。 使用场景及目标:①帮助系统集成商和客户简化边缘设备的初始配置和后续管理;②确保设备在不同网络环境下的安全启动和注册;③支持大规模边缘设备的自动化集群管理和应用程序编排;④提供详细的密钥管理和集群维护指南,确保系统的长期稳定运行。 其他说明:本文档是详细描述了Edge Peak技术及其应用案例。文档不仅提供了技术实现的指导,还涵盖了策略配置、安全性和扩展性的考虑,帮助用户全面理解和实施Intel的边缘计算解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值