●BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=2002
题解:
LCT
如果把弹跳的起点和终点连一条边,弹出去的与n+1号点连边,
则不难发现,整个图形成了一颗树,
同时需要支持树的修改(拆分,合并)和询问点的深度(该点到根的链上的点的个数),
所以LCT可以很轻松的解决本题。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#define MAXN 200050
using namespace std;
int N,M,next[MAXN];
struct LCT{
int ch[MAXN][2],fa[MAXN],rev[MAXN],size[MAXN];
bool Which(int x){return ch[fa[x]][1]==x;}
void Reverse(int x){swap(ch[x][0],ch[x][1]);rev[x]^=1;}
bool Isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
void Pushup(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
void Pushdown(int x){
if(!Isroot(x)) Pushdown(fa[x]);
if(rev[x]) Reverse(ch[x][0]),Reverse(ch[x][1]),rev[x]^=1;
}
void Rotate(int x){
static int y,z,l1,l2;
y=fa[x]; z=fa[y];
l1=Which(y); l2=Which(x); fa[x]=z;
if(!Isroot(y)) ch[z][l1]=x;
fa[y]=x; fa[ch[x][l2^1]]=y;
ch[y][l2]=ch[x][l2^1]; ch[x][l2^1]=y;
Pushup(y);
}
void Splay(int x){
static int y; Pushdown(x);
for(;y=fa[x],!Isroot(x);Rotate(x)) if(!Isroot(y))
Rotate(Which(y)==Which(x)?y:x);
Pushup(x);
}
void Access(int x){
static int y;
for(y=0;x;y=x,x=fa[x])
Splay(x),ch[x][1]=y,Pushup(x);//!!!
}
void Beroot(int x){
Access(x); Splay(x); Reverse(x);
}
void Cut(int x,int y){
Beroot(x); Access(y); Splay(y);
fa[x]=ch[y][0]=0; Pushup(y);
}
void Link(int x,int y){
Beroot(x); fa[x]=y;
}
void Modify(int x,int k){
static int t; t=min(x+k,N+1);
Cut(next[x],x); Link(t,x); next[x]=t;
}
int Query(int x){
Beroot(N+1); Access(x); Splay(x);
return size[x]-1;
}
}DT;
int main(){
scanf("%d",&N); DT.size[N+1]=1;
for(int i=1,k;i<=N;i++){
scanf("%d",&k); next[i]=min(i+k,N+1);
DT.fa[i]=next[i]; DT.size[i]=1;
}
scanf("%d",&M); int a,b,c;
for(int i=1;i<=M;i++){
scanf("%d%d",&a,&b); b++;
if(a==1) printf("%d\n",DT.Query(b));
else scanf("%d",&c),DT.Modify(b,c);
}
return 0;
}
●BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊的更多相关文章
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 4055 Solved: 2172[Submi ...
- bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2843 Solved: 1519[Submi ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊:分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意: 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆 ...
- 【刷题】BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- 洛谷 P3203 BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
随机推荐
- C语言的第 次作业总结
PTA实验作业 第一题: 使用函数输出水仙花数 1.设计思路: 2.碰到的问题及解决方法: 实验中碰到的主要问题是:虽然知道如何求每一位的数但不知道如何输出m到n之间的水仙花数,我上面截图中的和瓮恺视 ...
- SQLSERVER2012的分页新功能
SQLSERVER2012的分页新功能 简介 SQL Server 2012中在Order By子句之后新增了OFFSET和FETCH子句来限制输出的行数从而达到了分页效果.相比较SQL Server ...
- mysql基础篇 - 其他基本操作
基础篇 - 其他基本操作 其他基本操作 一.实验简介 本节实验中我们将学习并实践数据库的其他基本操作:索引.视图,导入和导出,备份和恢复等. 这些概念对于数据库管理员而言都非常重要,请 ...
- 第八条:覆盖equals时请遵守通用约定
==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...
- SQL语句取多列的最小值(排除0)
经常遇到获取数据表中多个列的最小值和最大值,例如: 获取这 4个价格的最小值和最大值: SELECT( SELECT min(minPrice) FROM ( VALUES (IIF(MarketSi ...
- Python内置函数(58)——input
英文文档: input([prompt]) If the prompt argument is present, it is written to standard output without a ...
- 查找git ignore的追踪
前言 版本控制说简单也简单,说复杂也困难的多.作为开发者,最基础的版本管理和团队协作的功能必须掌握.而其他一些相关的信息也可以了解下.比如,这次就有同事遇到了问题. 遇到的问题 在windows下,往 ...
- Spark快速入门
Spark 快速入门 本教程快速介绍了Spark的使用. 首先我们介绍了通过Spark 交互式shell调用API( Python或者scala代码),然后演示如何使用Java, Scala或者P ...
- python网络爬虫与信息提取 学习笔记day2
Day2: 查看robots协议: 查看京东的robots协议 查看百度的robots协议,可以看到百度拒绝了搜狗的爬虫233 爬取京东商品页面相关信息: import requests url = ...
- linux下查看mysql日志文件的方法
查看mysql日志方法: mysql默认不允许我们查看日志.需要更改一些设置 1 vi 更改配置文件 允许用户查看日志文件 sudo vi /etc/mysql/mysql.conf.d/mysqld ...