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

原创 2016年12月13日 19:34:33

题目大意:给出一个森林,支持两个操作:修改边,输出点到所在树的根的距离

LCT裸题。操作挺少的,只有Link和Cut操作(所以和到一起写了),维护一下Size即可。

#include <cstdio>
#define N 200005
using namespace std;
struct Node{
    Node *ch[2],*pa;
    int s;
    void maintain(){s=ch[0]->s+ch[1]->s+1;}
    int dir(){return pa->ch[0]==this ? 0 : pa->ch[1]==this ? 1 : -1; }//判断当前点与父亲的关系
    Node();
}*null=new Node();
Node p[N];
Node :: Node(){pa=ch[0]=ch[1]=null; s=null?1:0;}
void Rotate(Node* o,int d){
    Node* k=o->ch[d^1]; int d2;
    o->ch[d^1]=k->ch[d]; k->ch[d]->pa=o;
    k->ch[d]=o;
    o->maintain(); k->maintain();
    if(~(d2=o->dir())) o->pa->ch[d2]=k;
    k->pa=o->pa; o->pa=k;
}
void Splay(Node *o){
    Node* p; int d;
    while(~(d=o->dir())){
        p=o->pa;
        if(p->dir()==d) Rotate(p->pa,d^1);
        Rotate(o->pa,d^1);
    }
    return ;
}
void Access(Node* o){//将o点到根的路径设置为“重链”
    Node* p=null;
    while(o!=null) {
        Splay(o);
        o->ch[1]=p; o->maintain();
        p=o; o=o->pa;
    }
    return ;
}
void Link(Node* x,Node* y){
    Access(x); Splay(x);
        x->ch[0]->pa=null;
        x->ch[0]=null; x->maintain();//Cut操作
    x->pa=y;
    return ;
}
int main(){
    int n;
    scanf("%d",&n);
    null->ch[0]=null->ch[1]=null->pa=null;
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        if(i+x<=n) p[i].pa=&p[i+x];
    }
    int m;
    scanf("%d",&m);
    while(m--){
        int mode;
        scanf("%d",&mode);
        if(mode==1){
            int x;
            scanf("%d",&x); x++;
            Access(&p[x]); Splay(&p[x]);
            printf("%d\n",p[x].s);
        }
        else {
            int x,y;
            scanf("%d%d",&x,&y); x++;
            if(x+y<=n) Link(&p[x],&p[x+y]);
            else Link(&p[x],null);
        }
    }
    return 0;
}
版权声明:转载请注明:http://blog.csdn.net/YihAN_Z

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT
  • wzq_QwQ
  • wzq_QwQ
  • 2015年08月10日 13:41
  • 1553

bzoj2002:[Hnoi2010]Bounce 弹飞绵羊

思路:动态树。把每个装置看成点,能弹到的装置连边,能弹飞的装置连到n+1号点,每个点点权设为1,这样问几次弹飞就可以转化为该点到n+1号点的路径的点权和。 #include #include #in...
  • thy_asdf
  • thy_asdf
  • 2015年06月22日 19:58
  • 506

[BZOJ2002][HNOI2010]弹飞绵羊(LCT)

写作是与自己的灵魂交谈,借此把外在的生命转变成内在的心灵财富。
  • Clove_unique
  • Clove_unique
  • 2016年03月27日 14:38
  • 1148

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意:中文题。。 分析:先将这个数组分块,每块大小为sqrt(n),然后设定f[i]...
  • Fsss_7
  • Fsss_7
  • 2015年12月31日 01:38
  • 203

[bzoj2002] [Hnoi2010]Bounce 弹飞绵羊

Problem link[Hnoi2010]Bounce 弹飞绵羊Description某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开...
  • u011056504
  • u011056504
  • 2016年08月13日 21:55
  • 293

BZOJ 2002 Bounce 弹飞绵羊(分块|暴力|)(困难)

将序列分块,每块sqrt(n)个。 在每个块中维护f[i],to[i] f[i] 表示跳几次可以跳出所在块 to[i] 表示跳出所在块后到达的位置。 在查询时,我们O(sqrt(n))的时间进行“整块...
  • kaisa158
  • kaisa158
  • 2015年08月03日 22:20
  • 579

BZOJ 2002 HNOI2010 弹飞绵羊 分块

题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471 今天手滑用分块又重写了一遍这道题0.0 分块就是短啊 将弹...
  • PoPoQQQ
  • PoPoQQQ
  • 2014年10月21日 17:22
  • 1888

bzoj 2002 Bounce 弹飞绵羊

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 6894  Solved: 3610 [...
  • clover_hxy
  • clover_hxy
  • 2016年03月21日 19:40
  • 236

动态树-LCT-bzoj2002弹飞绵羊

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

HYSBZ - 2002 :Bounce 弹飞绵羊 (分块算法)

HYSBZ - 2002 :Bounce 弹飞绵羊 (分块算法) 神奇的分块
  • f2935552941
  • f2935552941
  • 2017年10月04日 00:35
  • 69
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
举报原因:
原因补充:

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