HNOI2010弹飞绵羊(块状数组)

不得不说块状数组好神奇的啊!这道题的标签可是splay的启发是合并(什么高大上的东西),竟然这么轻松的就解决了!


var x,y,i,j,tot,n,m,ch:longint;
f,k,l,bl,go:array[0..200100] of longint;
procedure init;
begin
readln(n);
x:=trunc(sqrt(n));j:=x;
for i:=1 to n do
begin
if j=x then begin j:=1;inc(tot);l[tot]:=i;end
else inc(j);
read(k[i]);
bl[i]:=tot;
end;
l[tot+1]:=n+1;
for i:=n downto 1 do
if i+k[i]>=l[bl[i]+1] then begin f[i]:=1;go[i]:=i+k[i];end
else begin f[i]:=f[i+k[i]]+1;go[i]:=go[i+k[i]];end;
end;
function ask(x:longint):longint;
var sum:longint;
begin
sum:=0;
while x<=n do begin inc(sum,f[x]);x:=go[x];end;
exit(sum);
end;
procedure replace(x,y:longint);
var i:longint;
begin
k[x]:=y;
for i:=x downto l[bl[x]] do
if i+k[i]>=l[bl[i]+1] then begin f[i]:=1;go[i]:=i+k[i];end
else begin f[i]:=f[i+k[i]]+1;go[i]:=go[i+k[i]];end;
end;
procedure main;
begin
readln(m);
for i:=1 to m do
begin
read(ch);
if ch=1 then
begin
readln(x);inc(x);
writeln(ask(x));
end
else
begin
readln(x,y);inc(x);
replace(x,y);
end;
end;
end;
begin
init;
main;
end.

时间: 2024-08-06 02:12:46

HNOI2010弹飞绵羊(块状数组)的相关文章

HNOI2010 弹飞绵羊

codevs 2333 弹飞绵羊 http://codevs.cn/problem/2333/ 2010年省队选拔赛湖南 题目描述 Description Lostmonkey发明了一种超级反弹装置.为了在绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿一条直线摆放 n个反弹装置,并按从前往后的方式将反弹装置依次编号为 0 到 n-1,对 0≤i≤n-1,为第 i 个反弹装置设定了初始弹力系数 ki,当绵羊落到第 i 个反弹装置上时,它将被往后弹出 ki 步,

Hnoi2010弹飞绵羊题解LCT

题目大意 给定一个序列,每个点有一个权值a[i],一只绵羊若站在点i上会被弹到第i+a[i]个点上,支持单点修改操作,求从某个点出发经过多少次会被弹飞. 题解 令每个点的父亲结点是会被弹到的结点,那询问时每个点的答案就是这个点的深度. LCT维护size域即可 一开始以为是有向树,后来发现自己犯2了,按无向的做法就可以. 做这种题千万别手残.我因为一句x->rever()打成x->rev^=1,就有了如下结果,调了快一整天了! Code #include <cstdio> #inc

洛谷P3203 [HNOI2010]弹飞绵羊【LCT】

题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞.为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数. 输入格式: 第一行包含一个整数n

BZOJ 2002 HNOI2010 弹飞绵羊 分块

题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471 今天手滑用分块又重写了一遍这道题0.0 分块就是短啊 将弹簧分为√n块 对于每个弹簧 我们记录一下从这个弹簧出发直到弹到块外为止的弹跳次数及落点 查询沿着落点弹到出去为止 修改从块开始到这个点为止修改一遍 这样修改和查询都是O(√n)的 #include<cmath> #include<cstdio> #include<cstring>

BZOJ2002 HNOI2010 弹飞绵羊 LCT

LCT=树链剖分+平衡树(多用Splay),AC之后才对这个等式深有感触-- 我们定义一个操作Access(x),这个操作可以将从x到根节点路径上的所有节点放到一颗Splay里,一切操作都在这棵Splay里做.你说要维护任意两个点的路径?反正是无向树换一下根不就好了-- 我们以执行Access的顺序为权值来进行树链剖分,每一条链用一颗Splay按照深度来维护,每一颗Splay与他的父亲(由于一条链一定是在一个点u的子树上,所以我们只需要让这颗Splay的根与u相连就好,无所谓根和u在原树中是否相

洛谷 P3203 [HNOI2010]弹飞绵羊 || bzoj2002

看来这个lct板子的确没什么问题 好像还可以分块做 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef long long LL; 5 namespace LCT 6 { 7 struct Node 8 { 9 Node *ch[2],*fa; 10 bool rev; 11 LL sz; 12 void upd() 13 { 14 sz=(ch[0]?ch[0]->sz:0)+(

【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree

2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答案 更改时,cut(x,next[x]) link(x,min(x+k,n+1)) 记得splay旋转后要更新size 1 #include<bits/stdc++.h> 2 #define N 200005 3 using namespace std; 4 int read(){ 5 int x

【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

(BZOJ挂了,还没在BZOJ测,先是在wikioi测过了,,) 囧.在军训时立志要学lct!!!这是一道lct的裸题,只有access操作(10行都没有啊亲...缩行大法的话,我就不说了..)(link操作相当于水过),其实lct很简单..想想都有点小激动...... lct用splay维护的话,一下就写好了..但是我在写lct的时候,发现了一些我原来splay的老问题,我原来也知道了的,就是将null的ch给赋值了,因为在rot操作里没有特判,所以导致了null的孩子被赋值了,导致我的lct

bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 15763  Solved: 8080[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开