动态树LCT模板题

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
inline int read()
{
int x = 0, flag = 1;
char c;
while(! isgraph(c = getchar()))
if(c == '-')
flag *= - 1;
while(isgraph(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
}
inline void println(int x)
{
if(x < 0)
putchar('-');
if(x == 0)
putchar('0');
int top = 0, ans[10 + (1 << 4)];
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
}
const int MAXN = (int)2e5 + (1 << 5);
struct node
{
int isroot, ch[2], fa, size;
}T[MAXN];
void update(int u)
{
T[u].size = ((T[u].ch[0] == - 1) ? 0 : T[T[u].ch[0]].size)
+ ((T[u].ch[1] == - 1) ? 0 : T[T[u].ch[1]].size) + 1;
}
inline int get_rela(int u)
{
return u == T[T[u].fa].ch[1];
}
void rotate(int u)
{
int fa = T[u].fa, fafa = T[T[u].fa].fa, rela = get_rela(u);
T[T[u].ch[rela ^ 1]].fa = fa;
T[fa].ch[rela] = T[u].ch[rela ^ 1];
T[u].ch[rela ^ 1] = fa;
T[fa].fa = u;
T[u].fa = fafa;
if(T[fa].isroot)
T[fa].isroot = 0, T[u].isroot = 1;
else
T[fafa].ch[T[fafa].ch[1] == fa] = u;
update(fa), update(u);
}
void splay(int u)
{
while(1)
{
if(T[u].isroot)
break;
if(! T[T[u].fa].isroot)
rotate((get_rela(u) == get_rela(T[u].fa)) ? T[u].fa : u);
rotate(u);
}
}
void access(int u)
{
splay(u);
while(T[u].fa != - 1)
{
int fa = T[u].fa;
splay(fa);
if(T[fa].ch[1] != - 1)
T[T[fa].ch[1]].isroot = 1;
T[u].isroot = 0;
T[fa].ch[1] = u;
update(fa);
splay(u);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ2002.in", "r", stdin);
freopen("BZOJ2002.out", "w", stdout);
#endif
int n = read();
T[n].fa = - 1;
for(int i = 0; i < n; i ++)
T[i].fa = min(read() + i, n);
for(int i = 0; i <= n; i ++)
T[i].size = 1, T[i].isroot = 1, T[i].ch[0] = T[i].ch[1] = - 1;
int m = read();
for(int i = 0; i < m; i ++)
{
int opt = read();
if(opt == 1)
{
int u = read();
access(u);
println(T[T[u].ch[0]].size); //这里要稍微注意一下
continue;
}
int u = read();
splay(u);
T[T[u].ch[0]].fa = T[u].fa;
T[T[u].ch[0]].isroot = 1;
T[u].ch[0] = - 1;
T[u].size = ((T[u].ch[1] == - 1) ? 0 : T[T[u].ch[1]].size) + 1;
T[u].fa = min(n, read() + u);
}
}

BZOJ2002弹飞绵羊的更多相关文章

  1. BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)

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

  2. bzoj2002 弹飞绵羊

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

  3. [Link-Cut-Tree][BZOJ2002]弹飞绵羊

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

  4. bzoj2002 弹飞绵羊 lct版

    这道题就是维护一个有根的lct 一开始建树全部建虚边 求多少次弹出就是求他到根的距离(根为n+1) 这里有个小技巧 将n+1作为根而没有虚根操作起来会比较方便 #include<cstdio&g ...

  5. bzoj2002 弹飞绵羊 分块

    这道题是分块的初尝试 讲给定的区间n进行分块处理 这个每次修改的复杂的只有logn 很方便 代码是学黄学长的 http://hzwer.com/3505.html 当然里面还是有一定我自己的想法在里面 ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2843  Solved: 1519[Submi ...

  7. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

  8. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

    [BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...

  9. 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊

    BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 Solution 很早以前写的一道分块题,最近在搞LCT,又做了一遍. 1.LCT做法 看到这种动态修改,想下LCT怎么维护. 修改操作就 ...

随机推荐

  1. PAT Basic 1075

    1075 链表元素分类 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元素的顺序是不能 ...

  2. ubuntu12.04安装wireshark

    1 安装 $ sudo apt-get install wireshark 2 启动 $ sudo wireshark 3 启动报错

  3. 全网最详细python中socket套接字send与sendall的区别

    将数据发送到套接字. 套接字必须连接到远程套接字.  返回发送的字节数. 应用程序负责检查是否已发送所有数据; 如果仅传输了一些数据, 则应用程序需要尝试传递剩余数据.(需要用户自己完成) 将数据发送 ...

  4. Githun&HEXO建站小记

    title: 建站小记 date: 2018-03-04 11:10:54 updated: 2018-03-06 12:00:00 tags: [hexo,next,建站,学习,前端技术,折腾,博客 ...

  5. [转] 在vue中使用SockJS实现webSocket通信

    最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,这就需要和服务器端建立webSocket连接,从而实现数据的实时获取和视图的实时刷新.在此将我的实现记录下来,希望可以给有同样需求的人一些帮助 ...

  6. webdriver高级应用- 在ajax方式产生的浮动框中,单击选择包含某个关键字的选项

    Ajax简介: Ajax:局部刷新,原理上也是一个js,js调用服务器的远程接口刷新局部页面数据. Ajax = 异步 JavaScript 和 XML(标准通用标记语言的子集). Ajax 是一种用 ...

  7. python-高级编程-02

    [yield 详解 协同程序 生成器表达式] 1> yield def res (): for i in range(10): x = yield i r = res() print r.nex ...

  8. 让Android软键盘默认进入英文键盘

    今天在做一个功能的 时候,需要输入法软键盘弹出后,需要进入英文输入界面. 可以通过设置EditText的输入类型为EMAIL来实现.     //将输入法切换到英文     edit.setInput ...

  9. kb-07线段树-12--二分查找区间边界

    /* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...

  10. ACM程序设计选修课——1051: Glamor Sequence(YY+求和公式)

    1051: Glamor Sequence Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 16  Solved: 5 [Submit][Status] ...