【LCT】BZOJ2002(Hnoi2010)[Bounce 弹飞绵羊]题解

原创 2017年05月17日 19:39:49

题目概述

有n个弹力装置,每个弹力装置i弹力系数为ki,会弹到i+ki,如果不存在i+ki则被弹飞,给出m个操作/询问,操作:将某个装置的弹力系数改变,询问:询问从某个弹力装置开始弹几次会被弹飞。

解题报告

加入一个n+1点表示弹飞,那么每个弹力装置就只会有一个目的地,但一个目的地可能会有很多儿子,所以是一棵树,用LCT进行维护。每次询问的话只需要将x->n+1的路径拿出来,求路径长度(节点个数-1)即可。

示例程序

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200000;

int n,te,K[maxn+5];
struct LCT
{
    int father[maxn+5],son[maxn+5][2],si[maxn+5];
    bool flip[maxn+5];
    void Pushup(int p) {si[p]=si[son[p][0]]+1+si[son[p][1]];}
    void Add_flip(int p) {swap(son[p][0],son[p][1]);flip[p]^=1;}
    void Pushdown(int p)
    {
        if (!flip[p]) return;
        if (son[p][0]) Add_flip(son[p][0]);
        if (son[p][1]) Add_flip(son[p][1]);
        flip[p]=false;
    }
    bool is_ro(int p) {return p!=son[father[p]][0]&&p!=son[father[p]][1];}
    void Rotate(int p)
    {
        int fa=father[p],d=p==son[fa][0];
        if (!is_ro(fa)) son[father[fa]][fa==son[father[fa]][1]]=p;
        son[fa][d^1]=son[p][d];father[son[p][d]]=fa;son[p][d]=fa;
        Pushup(fa);Pushup(p);father[p]=father[fa];father[fa]=p;
    }
    int top,stk[maxn+5];
    void Splay(int p) //用非递归Splay比较方便,省去了找p的过程
    {
        stk[++top]=p;
        for (int i=p;!is_ro(i);i=father[i]) stk[++top]=father[i];
        while (top) Pushdown(stk[top--]); //因为非递归,所以要先将上面的点传标记
        while (!is_ro(p))
        {
            int fa=father[p];
            if (!is_ro(fa))
            {
                int d1=fa==son[father[fa]][1],d2=p==son[fa][1];
                if (d1==d2) Rotate(fa); else Rotate(p);
            }
            Rotate(p);
        }
    }
    void Access(int p)
    {
        int lst=0;
        while (p)
        {
            Splay(p);son[p][1]=lst;Pushup(p);
            lst=p;p=father[p];
        }
    }
    void make_ro(int p) {Access(p);Splay(p);Add_flip(p);}
    void Link(int x,int y) {Access(y);make_ro(y);father[y]=x;}
    void Cut(int x,int y)
    {
        make_ro(y);Access(x);Splay(x);
        father[y]=son[x][0]=0;Pushup(x);
    }
};
LCT tr;

bool Eoln(char ch) {return ch==10||ch==13||ch==EOF;}
int readi(int &x)
{
    int tot=0,f=1;char ch=getchar(),lst='+';
    while ('9'<ch||ch<'0') {if (ch==EOF) return EOF;lst=ch;ch=getchar();}
    if (lst=='-') f=-f;
    while ('0'<=ch&&ch<='9') tot=tot*10+ch-48,ch=getchar();
    x=tot*f;
    return Eoln(ch);
}
void First_init() {for (int i=1;i<=n+1;i++) tr.si[i]=1;}
int main()
{
    freopen("program.in","r",stdin);
    freopen("program.out","w",stdout);
    readi(n);First_init();
    for (int i=1;i<=n;i++) readi(K[i]),tr.Link(min(i+K[i],n+1),i); //初始边
    readi(te);
    while (te--)
    {
        int td,x,y;readi(td);readi(x);x++;
        if (td==1)
        {
            tr.make_ro(n+1);tr.Access(x);tr.Splay(x);
            printf("%d\n",tr.si[x]-1);
        } else
        readi(y),tr.Cut(min(x+K[x],n+1),x),tr.Link(min(x+(K[x]=y),n+1),x);
        //和原来的目的地断开,连接到新的目的地上
    }
    return 0;
}
版权声明:欢迎转载,但要申明出处。http://blog.csdn.net/zzkksunboy

相关文章推荐

初识lct——洛谷p3203 bzoj2002 [HNOI2010]BOUNCE 弹飞绵羊

题目大意:现在有n个装置,每个装置会弹到一个地方(编号一定在它之后),也可能直接弹了出去,动态修改会弹到的地方,和动态查询从一个装置出发多少次会被弹出去。

BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT

题目大意:给出一个森林,支持两个操作:修改边,输出点到所在树的根的距离LCT裸题。操作挺少的,只有Link和Cut操作(所以和到一起写了),维护一下Size即可。#include #define N...

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT

bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 (LCT)

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5392  Solved: 2846 [...

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

Description某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设...

[LCT]BZOJ 2002——[Hnoi2010]Bounce 弹飞绵羊

2002: [Hnoi2010]Bounce 弹飞绵羊题目描述某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在...

【BZOJ】【P2002】【HNOI2010】【弹飞绵羊】【题解】【LCT】

bzoj挂了好几天了…… LCTl

BZOJ2002——[Hnoi2010]Bounce 弹飞绵羊

1、题目大意:就是给一个动态的森林求size域 2、分析: 这个就是一个动态树问题,对于每一个位置i有i+ki这个父亲, 于是这就是一个森林了,然后对于每一个修改直接lct维护就好,询问就是i到最外...

【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊

【BZOJ 2002】 [Hnoi2010]Bounce 弹飞绵羊 LCT模板题~

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 10629  Solved: 5476 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)