弹飞绵羊

题目传送门

解题思路

LCT。

将每个节点的权值设为\(1\),连接\(i\)和\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\)。从\(j\)弹飞需要的次数就是\(split(j,n)\)后,\(sum[i]-1\)的值。修改弹力系数,即为断开\(i\)和旧的\(i+ki\)的连接,然后连上\(i\)和新的\(i+ki\)。

为了方便,以下代码把下标都加一了,即原编号变为\(1-n\),弹飞设为\(n+1\)。

代码如下

#include <bits/stdc++.h>

using namespace std;

const int N = 200005;

int fa[N], ch[N][2], siz[N], rev[N], sta[N], v[N];

inline bool get(int x)
{
return ch[fa[x]][1] == x;
} inline bool isroot(int x)
{
return (!fa[x] || ch[fa[x]][1] != x && ch[fa[x]][0] != x);
} inline void push_up(int x)
{
siz[x] = siz[ch[x][1]] + siz[ch[x][0]] + 1;
} inline void rotate(int x)
{
int y = fa[x], z = fa[y];
bool u = get(x);
ch[y][u] = ch[x][u^1], fa[ch[x][u^1]] = y;
if(!isroot(y))
ch[z][get(y)] = x;
fa[x] = z;
ch[x][u^1] = y, fa[y] = x;
push_up(y), push_up(x);
} inline void pushr(int x)
{
swap(ch[x][1], ch[x][0]);
rev[x] ^= 1;
} inline void push_down(int x)
{
if(rev[x]){
pushr(ch[x][0]), pushr(ch[x][1]);
rev[x] = 0;
}
} inline void splay(int x)
{
int pos = 0;
sta[++pos] = x;
for(int i = x; !isroot(i); i = fa[i])
sta[++pos] = fa[i];
while(pos)
push_down(sta[pos--]);
while(!isroot(x)){
int y = fa[x];
if(!isroot(y))
get(x) == get(y) ? rotate(y): rotate(x);
rotate(x);
}
} inline void access(int x)
{
for(int y = 0; x; y = x, x = fa[x])
splay(x), ch[x][1] = y, push_up(x);
} inline void make_root(int x)
{
access(x); splay(x);
pushr(x);
} inline void split(int x, int y)
{
make_root(x);
access(y);splay(y);
} inline void link(int x, int y)
{
make_root(x);
fa[x] = y;
} inline void cut(int x, int y)
{
split(x, y);
fa[x] = ch[y][0] = 0;
push_up(y);
} int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++){
scanf("%d", &v[i]);
siz[i] = 1;
}
siz[n + 1] = 1;
for(int i = 1; i <= n; i ++){
if(i + v[i] <= n)
link(i, i + v[i]);
else
link(i, n + 1);
}
int m;
scanf("%d", &m);
for(int i = 1; i <= m; i ++){
int opt, x;
scanf("%d%d", &opt, &x);
++x;
if(opt == 1){
split(n + 1, x);
printf("%d\n", siz[x] - 1);
}
else {
int k;
scanf("%d", &k);
if(x + v[x] <= n)
cut(x, x + v[x]);
else
cut(x, n + 1);
if(x + k <= n)
link(x, x + k);
else
link(x, n + 1);
v[x] = k;
}
}
return 0;
}

P3203 [HNOI2010]弹飞绵羊(LCT)的更多相关文章

  1. [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)

    题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ...

  2. 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]

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

  3. P3203 [HNOI2010]弹飞绵羊(LCT)

    P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...

  4. 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  5. P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz

    好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...

  6. P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?

    好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...

  7. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)

    洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...

  8. BZOJ2002[Hnoi2010]弹飞绵羊——LCT

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

  9. [洛谷P3203][HNOI2010]弹飞绵羊

    题目大意:有$n$个节点,第$i$个节点有一个弹力系数$k_i$,当到达第$i$个点时,会弹到第$i+k_i$个节点,若没有这个节点($i+k_i>n$)就会被弹飞.有两个操作: $x:$询问从 ...

随机推荐

  1. Flink容错机制(checkpoint)

    checkpoint是Flink容错的核心机制.它可以定期地将各个Operator处理的数据进行快照存储( Snapshot ).如果Flink程序出现宕机,可以重新从这些快照中恢复数据. 1. ch ...

  2. 面试题:Nginx 是如何实现高并发?常见的优化手段有哪些?

    面试题: Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些? 面试官心理分析 主要是看应聘人员的对NGINX的基本原理是否熟悉, ...

  3. Reciting(second)

      It is subtly revealed in the caricature that a son is expressing his concern about disposing of nu ...

  4. docker调用yum时“"/usr/libexec/urlgrabber-ext-down" is not installed”

    原因: 1 docker镜像为高版本的fedora30:latest镜像,yum本身已被dnf替代,但部分功能仍不完整: 如:yum-builddep SPECS/xxx.spec 解决办法: 1 安 ...

  5. 关于html 修改滚动条的问题

    之前项目需要改变滚动条的样式 一.修改原生样式 原文地址:https://blog.csdn.net/zh_rey/article/details/72473284 问题在于无法兼容火狐与ie等浏览器 ...

  6. C++大整数类模板

    参考 :http://172.21.85.56/oj/resource/reportdetail?report_id=1678 支持 =.abs().pow().+=.-= *=./=.%=.+.-. ...

  7. Hibernate4教程二:基本配置

    可编程的配置方式一: 如果在配置cfg.xml的时候,不想在里面配置hbm.xml怎么办呢?可在程序里使用可编程的配置方式,也就是使用程序来指定在cfg.xml里面的配置信息,不推荐这种方式.如下: ...

  8. Tkinter初体验

    一.基本步骤 1.导入Tkinter模块 2.创建根窗口 3.填充组件 4.组件关联逻辑 5.进入主循环 二.Code #coding:utf-8 ''' 网关流量校验器 @author: Hongz ...

  9. LNMP环境安装

    一.LNMP 1.使用LNMP的优点: 资源占用少 更多并发 代理服务器 热启动 稳定高效 负载均衡 邮件服务器 2.安装前准备: 2.1查看防火墙(默认开启): [root@localhost ~] ...

  10. spring 获取url参数

    1. usl格式: http://localhost:8080/contact/delete/3 java代码 @RequestMapping(value="/delete/{id}&quo ...