关闭

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

标签: 图论LCT
676人阅读 评论(2) 收藏 举报
分类:

题目概述

有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;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

bzoj2002 弹飞绵羊

分为sqrt(n)左右块,next[i]记录从i跳出当前块的位置,time[i]记录相应次数,up返回当前点所在块最大值,low返回最小值。提前把low、up存起来似乎更快。。。开始先把next、ti...
  • sdlyyxy
  • sdlyyxy
  • 2015-02-25 20:18
  • 1037

【HNOI 2010】Bounce 弹飞绵羊 分块

BZOJ Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个...
  • Qantun_Mechanics
  • Qantun_Mechanics
  • 2016-09-30 17:22
  • 1261

BZOJ 2001 [Hnoi2010]City 城市建设 LCT+分治(未成功卡时卡过)

BZOJ 2001 [Hnoi2010]City 城市建设 LCT+分治(未成功卡时卡过)
  • wzq_QwQ
  • wzq_QwQ
  • 2015-11-12 15:51
  • 2260

【bzoj2002】【Hnoi2010】【Bounce 弹飞绵羊】【lct】

题目大意某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数...
  • chunkitlau
  • chunkitlau
  • 2017-05-12 21:25
  • 81

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

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

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

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

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT
  • wzq_QwQ
  • wzq_QwQ
  • 2015-08-10 13:41
  • 1500

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

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5392  Solved: 2846 [...
  • whai362
  • whai362
  • 2015-08-14 13:36
  • 562

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

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

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

2002: [Hnoi2010]Bounce 弹飞绵羊题目描述某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在...
  • CHN_JZ
  • CHN_JZ
  • 2017-07-10 15:35
  • 715
    个人资料
    • 访问:74398次
    • 积分:4244
    • 等级:
    • 排名:第8302名
    • 原创:324篇
    • 转载:2篇
    • 译文:0篇
    • 评论:180条
    公告
    ZZK,高一OIer,目前的目标是BZOJ200题(期中考已炸)。
    我的QQ:744388629。
    我的日记
    文章分类
    博客专栏