[HNOI2010] 弹飞绵羊 bounce
标签:分块。
题解:
200000,而且标号从0开始,很符合分块的条件啊。看看怎么实现。
首先分成√n个区间,然后如果我们对于每一个位置i,求出一个Next[i]和step[i],分别表示跳到的后一个位置与步数,因为是分块所以就是跳到下一个区间的步数与位置了。处理这两个数组要从前到后,只需要O(n)。
然后查询:自然是使用这两个数组,跳出去就return,复杂度O(√n)。
修改:修改一个点自然是O(1),但是前面的会跳到这个地方,那不是前面的都要改?非也,因为Next[]仅仅跨越了一个区间,所有最多有这个区间的起始位置到i个是需要更改的,也就是最大√n个,我们从i到起始位置烦着枚举,复杂度O(√n)。
所以总的复杂度为O(m√n)。
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=;
int n,m,cnt;
int W[MAXN],Next[MAXN],step[MAXN],team[MAXN];
inline int gi(){int res; scanf("%d",&res); return res;}
void update(int p)
{
if(p+W[p]>=n)
{
step[p]=;
Next[p]=n;
return ;
}
int net=p+W[p];
if(team[p]==team[net])
{
step[p]=step[net]+;
Next[p]=Next[net];
}
else
{
step[p]=;
Next[p]=net;
}
}
int query(int p)
{
int res=;
while(p!=n)
{
res+=step[p];
p=Next[p];
}
return res;
}
int main()
{
n=gi(); cnt=sqrt(n);
for(int i=;i<n;i++) W[i]=gi();
for(int i=;i<n;i++) team[i]=i/cnt;
for(int i=n-;i>=;i--) update(i);
m=gi();
while(m--)
{
int op=gi(),p=gi();
if(op==)
{
int w=gi();
W[p]=w;
for(int i=p;i>=;i--)
if(team[p]==team[i])
update(i);
else
break;
}
else
printf("%d\n",query(p));
}
return ;
}
标签:LCT
题解:
此题当然不缺乏LCT做法,对于LCT来说,这道题就是一道模板题,每次修改cut再link,维护sz代表子树的大小。使用一个根节点:n+1,也就是跳出去。M+A+S,查询x的左子树大小即可,也就是比他深度小的点的个数,不就是多少步跳出去吗?
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=;
int n,m;
int fa[MAXN],rev[MAXN],val[MAXN],Q[MAXN],ch[MAXN][],sz[MAXN];
bool isroot(int x){ return ch[fa[x]][]!=x && ch[fa[x]][]!=x; }
void Update(int x){ sz[x]=sz[ch[x][]]+sz[ch[x][]]+; }
bool get(int x){ return ch[fa[x]][]==x ;}
void Down(int x){ if(rev[x]){ rev[ch[x][]]^=; rev[ch[x][]]^=; rev[x]^=; swap(ch[x][],ch[x][]); } }
void Rotate(int x)
{
int old=fa[x],oldf=fa[old],op=get(x);
if(!isroot(old)) ch[oldf][ch[oldf][]==old]=x;
ch[old][op]=ch[x][op^]; fa[ch[x][op^]]=old;
ch[x][op^]=old; fa[old]=x; fa[x]=oldf;
Update(old); Update(x);
}
void Splay(int x)
{
int tp=; Q[]=x;
for(int i=x;!isroot(i);i=fa[i]) Q[++tp]=fa[i];
for(int i=tp;i;i--) Down(Q[i]);
for(int FA; !isroot(x) ; Rotate(x))
{
FA=fa[x];
if(!isroot(FA)) Rotate(get(x)==get(FA)?FA:x);
}
}
void Access(int x){ int t=; while(x){ Splay(x); ch[x][]=t; Update(x); t=x; x=fa[x]; } }
void Makeroot(int x){ Access(x); Splay(x); rev[x]^=;}
void Link(int x,int y){ Makeroot(x); fa[x]=y;}
void Cut(int x,int y){ Makeroot(x); Access(y); Splay(y); if(ch[y][]==x) fa[x]=ch[y][]=;}
int main( )
{
scanf("%d",&n); sz[n+]=;
for(int i=;i<=n;i++) scanf("%d",&val[i]) , sz[i]=;
for(int i=n;i>=;i--) Link(i,min(i+val[i],n+));
scanf("%d",&m);
while(m--)
{
int x,op,y,ans=;
scanf("%d%d",&op,&x); x++;
if(op==)
{
Makeroot(n+); Access(x); Splay(x);
printf("%d\n",sz[ch[x][]]);
}
else
{
scanf("%d",&y);
Makeroot(n+); Access(x);
Cut(x,min(x+val[x],n+));
val[x]=y;
Link(x,min(x+val[x],n+));
}
}
return ;
}
[HNOI2010] 弹飞绵羊 bounce的更多相关文章
- P3203 [HNOI2010]弹飞绵羊(LCT)
P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...
- [HNOI2010] 弹飞绵羊 (分块)
[HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ...
- 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
- [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)
[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...
- 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
- [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)
题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ...
- P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz
好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...
- P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?
好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...
- 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]
题目传送门 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...
随机推荐
- leetcode dfs Flatten Binary Tree to Linked List
Flatten Binary Tree to Linked List Total Accepted: 25034 Total Submissions: 88947My Submissions Give ...
- 安装 jdk-8u121( jdk1.8 ) Eclipse jee neon java EE 4.6 并配置 中国科学技术大学 http://mirrors.ustc.edu.cn/eclipse/ 仓库源
官网太慢用百度网盘,打不开刷新几次试试 http://pan.baidu.com/s/1qYTUrGK#list/path=%2F 首先下载安装 jdk-8u121-windows-x64.exe ...
- jquery 使用ajax,正常返回后,不执行success的问题
背景: 在使用到jQuery的ajax时,如果指定了dataType为json,老是不执行success回调,而是执行了error回调函数. 原因: 然后继续下载了几个jquery版本,如1.3.2, ...
- linux系统上安装svn服务器 环境linux+nginx+svnserver
系统:Ubuntu 12.04 64位 lnmp环境 集成软件:PHP5.4.27.Nginx1.6.0.MySQL5.5.37 阿里云server svnserver有2种执行方式:独立server ...
- UIView封装动画--iOS 利用系统提供方法来做弹性运动
iOS 利用系统提供方法来做弹性运动 /*创建弹性动画 damping:阻尼,范围0-1,阻尼越接近于0,弹性效果越明显 velocity:弹性复位的速度 */ [UIView animateWith ...
- Vue 组件实例属性的使用
前言 因为最近面试了二.三十个人,发现大部分都还是只是停留在 Vue 文档的教程.有部分连教程这部分的文档也没看全.所以稍微写一点,让新上手的 Vuer 多了解 Vue 文档的其他更需要关注的点. 因 ...
- vue项目刷新当前页面
场景: 有时候我们在vue项目页面做了一些操作,需要刷新一下页面. 解决的办法及遇到的问题: this.$router.go(0).这种方法虽然代码很少,只有一行,但是体验很差.页面会一瞬间的白屏,体 ...
- LightOJ - 1027 A Dangerous Maze —— 期望
题目链接:https://vjudge.net/problem/LightOJ-1027 1027 - A Dangerous Maze PDF (English) Statistics For ...
- 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)
题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...
- poj 2420 A Star not a Tree? —— 模拟退火
题目:http://poj.org/problem?id=2420 给出 n 个点的坐标,求费马点: 上模拟退火. 代码如下: #include<iostream> #include< ...