【BZOJ2002】弹飞绵羊

原创 2015年11月18日 19:35:56

第一道LCT,纪念一下~

#include<iostream>
#include<cstdio>
#define maxn 200000
using namespace std;
int n;
int ch[maxn+10][2],fa[maxn+10],sz[maxn+10];
int rc(int f,int o){return ch[f][1]==o;}
void pushup(int o){
    if(!o)return;
    sz[o]=sz[ch[o][0]]+sz[ch[o][1]]+1;
}
bool root(int o){return ch[fa[o]][0]!=o&&ch[fa[o]][1]!=o;}
void rotate(int o){
    int f=fa[o],r=rc(fa[o],o);
    if(!root(f))fa[ch[fa[f]][rc(fa[f],f)]=o]=fa[f];
    else fa[o]=fa[f];
    fa[ch[f][r]=ch[o][r^1]]=f;
    fa[ch[o][r^1]=f]=o;
    pushup(f);
    pushup(o);
}
void splay(int o){
    while(!root(o)){
        if(!root(fa[o])&&rc(fa[fa[o]],fa[o])==rc(fa[o],o))rotate(fa[o]);
        rotate(o);
    }
}
void access(int u){
    int v=0;
    while(u){
        splay(u);
        ch[u][1]=v;
        pushup(u);
        v=u;
        u=fa[u]; 
    }
}
void join(int v,int u){
    access(v);
    splay(v);
    fa[ch[v][0]]=0;
    ch[v][0]=0;
    fa[v]=u;
    access(v);
}
int main(){
    freopen("2002.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        fa[i]=min(n+1,i+a);
    }
    int m;
    scanf("%d",&m);
    while(m--){
        int k,u;
        scanf("%d%d",&k,&u);
        u++;
        if(k==1){
            access(u);
            splay(u);
            printf("%d\n",sz[u]-1);
        }else{
            int c;
            scanf("%d",&c);
            join(u,min(n+1,u+c));
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

bzoj1192: [HNOI2006]鬼谷子的钱袋

Description鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政。有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会,其中有一件...

915总结

突然发现自己已经颓了将近一个月了(自从暑假回来就没怎么写过总结),有必要调整到noip的状态了。周日acm不能带版,5个小时8道题,回去苦练手挖代码能力/滑稽。今天上午的题又是水题,t2玄学2的平方没...

BZOJ2002弹飞绵羊

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

【bzoj 2002】 Bounce 弹飞绵羊 题解&代码

分块
  • DERITt
  • DERITt
  • 2016年03月14日 21:10
  • 310

BZOJ2002——[Hnoi2010]Bounce 弹飞绵羊

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

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

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

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

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

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

BZOJ2002题解。

动态树-LCT-bzoj2002弹飞绵羊

我的第一篇博客给LCT(Link-Cut Tree)^_动态树要求我们维护一个由若干棵子结点无序的有根树组成的森林。 要求这个数据结构支持对树的分割,合并,对某个点到它的根的路径的某些操作, 以及对某...
  • Frods
  • Frods
  • 2016年08月18日 19:44
  • 575

bzoj 2002 弹飞绵羊 分块 解题报告

他邀请小绵羊一起玩个游戏。
  • Hawo11
  • Hawo11
  • 2017年07月20日 09:16
  • 125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ2002】弹飞绵羊
举报原因:
原因补充:

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