P3203 [HNOI2010] 弹飞绵羊

news/2025/1/24 16:34:23/文章来源:https://www.cnblogs.com/LG017/p/18689748

P3203 [HNOI2010] 弹飞绵羊

题目描述

某天,Lostmonkey 发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。

游戏一开始,Lostmonkey 在地上沿着一条直线摆上 \(n\) 个装置,每个装置设定初始弹力系数 \(k_i\),当绵羊达到第 \(i\) 个装置时,它会往后弹 \(k_i\) 步,达到第 \(i+k_i\) 个装置,若不存在第 \(i+k_i\) 个装置,则绵羊被弹飞。

绵羊想知道当它从第 \(i\) 个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey 可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

输入格式

第一行包含一个整数 \(n\),表示地上有 \(n\) 个装置,装置的编号从 \(0 \sim n-1\)

接下来一行有 \(n\) 个正整数,依次为那 \(n\) 个装置的初始弹力系数。

第三行有一个正整数 \(m\),表示操作次数。接下来 \(m\) 行每行至少有两个数 \(i,j\)

  • \(i=1\),你要输出从编号为 \(j\) 的装置出发被弹几次后被弹飞

  • \(i=2\),则还会再输入一个正整数 \(k\),表示编号为 \(j\) 的弹力装置的系数被修改成 \(k\)

输出格式

对于每个 \(i=1\) 的操作,输出一行一个整数表示答案。

【数据范围】

对于 \(100\%\) 的数据,\(1\le n \le 2\times 10^5\)\(1\le m \le 10^5\)

Solution:

LD再不放假让你飞起来

没想到这种题目还能用 LCT 做。我们思考一下每次重设弹力系数相当于什么:相当于断掉原来的边然后连一条 (x,x+k) 的边。所以我们开始时将每个点到对应的“着陆点”上就好了,然后注意一下因为弹飞显然是单向的,所有我们只需要让 \(x\) 认父就好了,并不需要像原来的 link 一样。然后查询就直接 access 然后 splay 就好了。我们甚至都不需要换根(显然,因为没有查询两个点的路径的需求)。

然后这道看起来很模拟的 LCT 就被我们愉快的做完了。

Code:

#include<bits/stdc++.h>
const int N=2e5+5;
using namespace std;
int n,m;
struct LCT{struct Tree{int tag,ff,ch[2],siz;}t[N<<2];int st[N];#define ls t[x].ch[0]#define rs t[x].ch[1]#define fa t[x].ffinline bool isroot(int x){return (t[fa].ch[0]==x||t[fa].ch[1]==x);}inline void pushup(int x){t[x].siz=t[ls].siz+t[rs].siz+1;}inline void rotate(int x){int y=fa,z=t[fa].ff,k=t[fa].ch[1]==x ? 1 : 0;if(isroot(y))t[z].ch[t[z].ch[1]==y]=x;t[x].ff=z;t[y].ch[k]=t[x].ch[!k];if(t[x].ch[!k])t[t[x].ch[!k]].ff=y;t[x].ch[!k]=y;t[y].ff=x;pushup(y);}inline void splay(int x){int y=x,z=0;while(isroot(x)){y=fa,z=t[fa].ff;if(isroot(y)){rotate((t[y].ch[1]==x)==(t[z].ch[1]==y) ? y : x);}rotate(x);}pushup(x);}void access(int x){int y=0;while(x){splay(x);rs=y;pushup(x);y=x;x=fa;}}void link(int x,int y){if(y<=n){t[x].ff=y;pushup(x);}}void cut(int x) // 这里是减去一个点 x{access(x),splay(x);t[x].ch[0]=t[ls].ff=0;}int query(int x){access(x);splay(x);return t[x].siz;}
}T;
void work()
{cin>>n;for(int i=1,tmp;i<=n;i++){scanf("%d",&tmp);T.t[i].siz=1;T.link(i,i+tmp);}cin>>m;for(int i=1,opt,x,y;i<=m;i++){scanf("%d%d",&opt,&x);x++;if(opt&1){int ans=T.query(x);printf("%d\n",ans);}else{scanf("%d",&y);T.cut(x);T.link(x,x+y);}}
}
int main()
{//freopen("bounce.in","r",stdin);freopen("bounce.out","w",stdout);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874782.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AQS学习笔记

一、使线程进入等待状态和唤醒状态的三种方法 1、使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程,需配合synchronized关键字使用 2、使用JUC包中的Condition的await()方法让线程等待,使用signal()方法唤醒线程 3、LockSupport类可以阻塞当前线程以…

Oracle安装指南 Xming远程桌面

安装Xming然后使用Oracle用户连接登录,设置DISPLAY环境变量(IP地址为你的windows客户端IP地址) export DISPLAY=192.168.111.155:0.0然后执行dbca就会弹出数据库配置界面了参考链接:https://www.cnblogs.com/iancloud/p/15015683.html

P4070 [SDOI2016] 生成魔咒

P4070 [SDOI2016] 生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 \(1,2\) 拼凑起来形成一个魔咒串 \([1,2]\)。 一个魔咒串 \(S\) 的非空字串被称为魔咒串 \(S\) 的生成魔咒。 例如 \(S=[1,2,1]\) 时,它的生成魔咒有 \([1],[2],[1…

深入探讨触发器的创建与应用:数据库自动化管理的强大工具

title: 深入探讨触发器的创建与应用:数据库自动化管理的强大工具 date: 2025/1/24 updated: 2025/1/24 author: cmdragon excerpt: 触发器是一种强大的数据库对象,它能够在特定事件发生之前或之后自动执行一组SQL语句。作为一种自动化管理工具,触发器在许多数据库管理场景…

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Jan 22, 2025 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

VS.net中快捷键收缩和展开代码段

i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M 折叠或展开当前方法 iv. Ctrl-M-L展开所有方法 其他的快捷方式:怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 双击状态栏中的行号2.. 怎样创建矩形选区? 两…

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…

Vmware 虚拟机克隆注意事项-CentOS7

1.克隆后修改MAC地 2.修改 UUID,UUID克隆虚拟机后一般是一样的,需要进行修改 输入命令uuidgen,将生成的UUID写入ifcfg-ens33 【文件位置:/etc/sysconfig/network-scripts/ifcfg-ens33】 【我克隆的时候并没有修改,但是也一样可以联网,不知道为啥】 3.修改主机名 先临时修…

autocad Ribbon创建的一种新思路

之前开发的功能相对简单, 一个RibbonTab就把相关的功能展示出来了。 目前着手准备开发的功能, 需要多个RibbonTab, 且不想显示AutoCAD或Civil 3D自身的RibbonTab, 曾经想模拟3d3s的样子来切换RibbonTab, 但发现3d3s是将AutoCAD原生的Cuix和自己的RibbonTab结合到一起, 对…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关):提供服务路由能力 提供各种拦截支持1、分布式网关推荐 建议使用专业的分布…

Mac安装Prometheus + Grafana

一、安装Prometheus 1、下载安装 brew install prometheus2、安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3、修改配置文件 默认配置文件路径:/opt/homebrew/etc/prometheus.yml global:scrape_interval: 15sscrape_configs:- job_name: "prometheus"static_co…

Python基础6——装饰器(续) 递归 模块

1.函数1.1 参数当默认参数的值为可变类型时慎用# 不推荐使用以下代码 def func(data, value=[]):pass可以将默认参数的值改为None# 推荐使用以下代码 def func(data, value=None):if not value:value = []案例def func(data, value=[]):value.append(data)return valuev1 = fun…