BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
Description
某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次 后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。
Input
第 一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接 下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成 k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000
Output
对于每个i=1的情况,你都要输出一个需要的步数,占一行。
Sample Input
1 2 1 1
3
1 1
2 1 1
1 1
Sample Output
2
3
解题思路:
LCT,很显然要让 i 与 i 能到的点连边,yy一个不存在的点n+1,让所有点与它连边表示弹飞。
更改时先Cut后Link
最后查询时将n+1与x路径提取,查询重量即可(注意要-1^_^)
代码:
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define lll tr[spc].ch[0]
- #define rrr tr[spc].ch[1]
- #define ls ch[0]
- #define rs ch[1]
- const int N=;
- struct trnt{
- int ch[];
- int lzt;
- int fa;
- int wgt;
- bool anc;
- }tr[N];
- int nx[N];
- int n,m;
- bool whc(int spc)
- {
- return tr[tr[spc].fa].rs==spc;
- }
- void pushup(int spc)
- {
- tr[spc].wgt=tr[lll].wgt+tr[rrr].wgt+;
- return ;
- }
- void trr(int spc)
- {
- if(!spc)
- return ;
- std::swap(lll,rrr);
- tr[spc].lzt^=;
- return ;
- }
- void pushdown(int spc)
- {
- if(tr[spc].lzt)
- {
- tr[spc].lzt=;
- trr(lll);
- trr(rrr);
- }
- return ;
- }
- void recal(int spc)
- {
- if(!tr[spc].anc)
- recal(tr[spc].fa);
- pushdown(spc);
- return ;
- }
- void rotate(int spc)
- {
- int f=tr[spc].fa;
- bool k=whc(spc);
- tr[f].ch[k]=tr[spc].ch[!k];
- tr[spc].ch[!k]=f;
- if(tr[f].anc)
- {
- tr[spc].anc=;
- tr[f].anc=;
- }else
- tr[tr[f].fa].ch[whc(f)]=spc;
- tr[spc].fa=tr[f].fa;
- tr[f].fa=spc;
- tr[tr[f].ch[k]].fa=f;
- pushup(f);
- pushup(spc);
- return ;
- }
- void splay(int spc)
- {
- recal(spc);
- while(!tr[spc].anc)
- {
- int ft=tr[spc].fa;
- if(tr[ft].anc)
- {
- rotate(spc);
- return ;
- }
- if(whc(spc)^whc(ft))
- rotate(spc);
- else
- rotate(ft);
- rotate(spc);
- }
- return ;
- }
- void access(int spc)
- {
- int lst=;
- while(spc)
- {
- splay(spc);
- tr[rrr].anc=;
- tr[lst].anc=;
- rrr=lst;
- pushup(spc);
- lst=spc;
- spc=tr[spc].fa;
- }
- return ;
- }
- void Mtr(int spc)
- {
- access(spc);
- splay(spc);
- trr(spc);
- return ;
- }
- void Link(int spc,int y)
- {
- access(spc);
- splay(spc);
- tr[spc].fa=y;
- return ;
- }
- void Cut(int x,int y)
- {
- Mtr(x);
- access(y);
- splay(x);
- tr[x].rs=;
- tr[y].anc=;
- tr[y].fa=;
- return ;
- }
- void split(int x,int y)
- {
- Mtr(x);
- access(y);
- splay(y);
- }
- int dest(int i)
- {
- return (i+nx[i]>n)?(n+):(i+nx[i]);
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n+;i++)
- tr[i].anc=;
- for(int i=;i<=n;i++)
- {
- scanf("%d",&nx[i]);
- Link(i,dest(i));
- }
- scanf("%d",&m);
- while(m--)
- {
- int i,j,k;
- scanf("%d",&i);
- if(i==)
- {
- scanf("%d",&j);
- j++;
- split(j,n+);
- printf("%d\n",tr[n+].wgt-);
- }else{
- scanf("%d%d",&j,&k);
- j++;
- Cut(j,dest(j));
- nx[j]=k;
- Link(j,dest(j));
- }
- }
- return ;
- }
BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)的更多相关文章
- [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [BZOJ2002][Hnoi2010]Bounce弹飞绵羊 LCT
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 建图,每次往后面跳就往目标位置连边,将跳出界的点设为同一个点.对于修改操作发现可以用 ...
- BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 【LCT】【分块】
BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始, ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- [bzoj2002][Hnoi2010]Bounce弹飞绵羊_LCT
Bounce弹飞绵羊 bzoj-2002 Hnoi-2010 题目大意:n个格子,每一个格子有一个弹簧,第i个格子会将经过的绵羊往后弹k[i]个,达到i+k[i].如果i+k[i]不存在,就表示这只绵 ...
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [bzoj2002][Hnoi2010]Bounce弹飞绵羊——分块
Brief description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装 ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 这一题除了LCT解法,还有一种更巧妙,代码量更少的解法,就是分块.先想,如果仅仅记录每 ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊——分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一次用分块,感觉超方便啊: 如果记录每个点的弹力系数,那么是O(1)修改O(n)查询 ...
随机推荐
- 识别CentOS和Ubuntu的系统版本
识别CentOS和Ubuntu的系统版本1.用 lsb-release#!/bin/bashInstall_LSB(){ if [ "$PM" = "yum ...
- sass01
Chrome --流行的浏览器,及前端开发调试工具 WebStorm --强大的跨平台前端集成开发环境 Sublime Text --神器级别的代码编辑器,如vim般强大,而上手难度极低. ----- ...
- C++中explicit关键字作用
explicit是c++中不太常用的一个关键字,其作用是用于修饰构造函数,告诉编译器定义对象时不做隐式转换. 举例说明: include <iostream> include <st ...
- RedHat Linux 下安装、测试摄像头
RedHat Linux 下安装.测试摄像头(全文见附件) 随着视频电话的迅速发展我相信大家一定有过在Windows 下安装摄像头的经历,然而大多数 都不支持Linux .我现以罗技摄像头为例 ...
- Ubuntu 16.04 实现有线 无线同时用
因为工作的原因,经常会用有线网卡连接服务器进行配置,无线网卡上外网. 一.查看当前网关信息 pipci@ubuntu:~$ ip route showdefault via 192.168.2.1 d ...
- Bootstrap概览
摘选自runnoob.com,bootstrap4所有api概览: 一.安装: 弹性盒子(flexbox) Bootstrap 3 与 Bootstrap 4 最大的区别就是 Bootstrap 4 ...
- Chrome OS 70 发布:这是安卓的私生子吗?
谷歌于28日正式宣布推出Chrome OS 70.这个最新的Chrome OS系统在一些设计上具备了更多安卓风味,为配备了触摸屏的Chromebook.平板电脑和二合一设备带来了操作界面改善. 据9t ...
- Linux系统中命令提示符解释-Linux中命令格式、分类-bash中的快捷键
1.命令提示符 [root@mysqlserver01 opt]# [root@mysqlserver01 ~]# root 当前用户名 @ 固定的(格式) mysqlserver01 主机名 opt ...
- pip-window安装
windows 安装: 保证计算机联网直接使用cmd 执行 python -m pip install -U pip 自动安装 找到 python安装的路径 C:\Users\Administrato ...
- php https链接
1.安装soap扩展 2.安装openssL 3.代码执行 function issure($sn){//通过soap链接接口 进行确认是否是正确的sn码 try{ $clie ...