BZOJ 2002 LCT板子题

思路:

LCT啊...

(分块也行)

不过YOUSIKI出了一道“弹飞大爷” 就不能用分块水过去了

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=200050;
int fa[N],ch[N][2],rev[N],size[N],n,op,q[N],top,a[N],m,xx,yy;
bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
void push_up(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
void push_down(int x){if(rev[x])rev[x]=0,rev[ch[x][0]]^=1,rev[ch[x][1]]^=1,swap(ch[x][0],ch[x][1]);}
void rotate(int p){
    int q=fa[p],y=fa[q],f=(ch[q][1]==p);
    ch[q][f]=ch[p][!f],fa[ch[q][f]]=q;
    ch[p][!f]=q,fa[p]=y;
    if(!isroot(q)){
        if(ch[y][0]==q)ch[y][0]=p;
        if(ch[y][1]==q)ch[y][1]=p;
    }fa[q]=p;push_up(q);
}
void splay(int x){
    q[++top]=x;
    for(int i=x;!isroot(i);i=fa[i])q[++top]=fa[i];
    while(top)push_down(q[top--]);
    for(int y=fa[x];!isroot(x);rotate(x),y=fa[x])if(!isroot(y)){
        if((ch[y][0]==x)^(ch[fa[y]][0]==y))rotate(x);
        else rotate(y);
    }push_up(x);
}
void access(int x){for(int t=0;x;t=x,x=fa[x])splay(x),ch[x][1]=t,push_up(x);}
void makeroot(int x){access(x),splay(x),rev[x]^=1;}
void link(int x,int y){makeroot(x),fa[x]=y;}
void cut(int x,int y){makeroot(x),access(y),splay(y);ch[y][0]=fa[x]=0;}
void split(int x,int y){makeroot(x),access(y),splay(y);}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)link(i,a[i]+i>n?n+1:a[i]+i);
    scanf("%d",&m);
    while(m--){
        scanf("%d%d",&op,&xx),xx++;
        if(op==1)split(n+1,xx),printf("%d\n",size[xx]-1);
        else scanf("%d",&yy),cut(xx,xx+a[xx]>n?n+1:xx+a[xx]),a[xx]=yy,link(xx,xx+a[xx]>n?n+1:xx+a[xx]);
    }
}
时间: 2024-10-03 00:36:33

BZOJ 2002 LCT板子题的相关文章

lct 模版题 bzoj 2002 2049

很早就有人给我推荐的模版题,然后我最近才刷的(' '    ) 昨天的tree 不知道比他们高到哪里去了,我和他谈笑风生啊! bzoj 2002 弹飞绵羊 重点:这道题的cut和link 由于这道题链的特殊性所以不能用提根的方法搞,可以注意到每一次cut位置一定是前面的一个元素,所以access 上去之后直接把左边的儿子丢掉就行了(我原来的cut 是在不知道两个点的儿子关系时就强行提根(' '    )) 然后link的时候直接把cut的那一棵splay接过去就行了 1 #include <io

bzoj 2002

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3848  Solved: 2051[Submit][Status] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki

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

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 4204  Solved: 2255 [Submit][Status] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+

沉迷Link-Cut tree无法自拔之:[BZOJ2049]洞穴勘探(蒟蒻的LCT板子)

来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 最近学了一波 \(LCT\) , 于是怒刷 \(LCT\) 合集...... $ $ 学的时候借鉴了 Clove_unique的博客 以及 PoPoQQQ的PPT 写得很详细,初学者可以去看看... $ $ 先甩一道板子题... $ $ 辣鸡得不能再辣鸡的题...只有 \(cut\) 和 \(link\) 操作, 然后就是判连通性... $ $ //made by Hero_of_Someone #inclu

BZOJ第一页刷题计划

BZOJ第一页刷题计划 已完成:1 / 100 BZOJ1000:A+B

BZOJ 4668 LCT

思路: 这不是LCT裸题嘛23333 (好像并查集+按秩合并就可以搞了 我还是too young) 维护边权的话 就新加一个点 代表边 这个点想线段的两个端点连边就好了 //By SiriusRen #include <bits/stdc++.h> using namespace std; const int N=1000050; int n,m,op,xx,yy,top,lastans,T; int fa[N],ch[N][2],q[N],maxx[N],rev[N],v[N],f[N];

POJ 3278 Catch That Cow(BFS,板子题)

Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 88732   Accepted: 27795 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,00

BZOJ 2843 LCT

这还是道LCT的题,跟着czl做了好多LCT的题啊!没事,czl带我飞!加油,不错,挺顺利的.加油!1592毫秒, 第一次考虑了代码量, 我写这个花了 2800的代码长度, 然而czl只有1900, 代码简化还是很重要啊! 1 #include<cstdio> 2 #include<iostream> 3 #define lc c[k][0] 4 #define rc c[k][1] 5 #define rep(i,j,k) for(int i = j; i <= k; i+

2014鞍山网络预选赛1006(LCT模板题)hdu5002

Tree Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 41    Accepted Submission(s): 10 Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node is as