【[HNOI2010]弹飞绵羊】
发现好像写了一个洛谷上最快的分块
这道题曾经一度感觉非常不可做,因为\(LCT\)的标签以及没有什么思路的分块
但是自从\(yy\)出来一个错误的哈希冲突分块之后(修改的时候挂掉了),就发现这道题不就是我曾经的那个错误的思路吗
这种要往后不断的跳的题目,我们暴力往后跳的话肯定是会爆炸的,因为这样的复杂度完全取决于询问
于是我们就分块好了,一次跳一个不行,那么我们就一次跳一个块好了
我们设\(b[i]\)表示从\(i\)这个位置开始跳,直到跳出所在块的跳跃次数是多少,\(c[i]\)表示\(i\)这个位置跳出所在块之后在哪一个位置
这个样子的话我们就能做到一次跳一个块了,于是现在询问的复杂度有了保证\
这两个数组显然可以预处理出来,因为\(i\)往后跳一部肯定到达了\(i+a[i]\)这个位置,于是就有\(b[i]=b[i+a[i]]+1\),\(c[i]=c[i+a[i]]\),对于每一个块倒着预处理就好了
之后就是修改,因为这里只有单点修改,于是我们直接拎出那个块来,修改一下,像预处理那样暴力重构整个块就好了
复杂度也是\(O(\sqrt{n})\)
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define re register
#define maxn 200005
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int a[maxn];
int b[maxn],c[maxn];
int l[maxn],r[maxn];
int len,Q,n,tot;
inline void Build_Block()
{
len=std::sqrt(n);
int k=1;
while(k<=n)
{
l[++tot]=k;
r[tot]=min(n,l[tot]+len-1);
k=r[tot]+1;
for(re int i=r[tot];i>=l[tot];--i)
if(i+a[i]>r[tot]) b[i]=1,c[i]=i+a[i];
else b[i]=b[i+a[i]]+1,c[i]=c[i+a[i]];
}
}
inline int find(int x)
{
if(x%len==0) return x/len;
return x/len+1;
}
inline int query(int x)
{
int ans=0;
while(x<=n)
{
ans+=b[x];
x=c[x];
}
return ans;
}
inline void change(int x,int val)
{
int t=find(x);
a[x]=val;
for(re int i=x;i>=l[t];--i)
if(i+a[i]>r[t]) b[i]=1,c[i]=i+a[i];
else b[i]=b[i+a[i]]+1,c[i]=c[i+a[i]];
}
int main()
{
n=read();
for(re int i=1;i<=n;i++)
a[i]=read();
Build_Block();
Q=read();
int opt,x,y;
while(Q--)
{
opt=read(),x=read();
if(opt==1) printf("%d\n",query(x+1));
else y=read(),change(x+1,y);
}
return 0;
}
【[HNOI2010]弹飞绵羊】的更多相关文章
- 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个装置, ...
- P3203 [HNOI2010]弹飞绵羊(LCT)
弹飞绵羊 题目传送门 解题思路 LCT. 将每个节点的权值设为\(1\),连接\(i\)和\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\).从\(j\)弹飞需要的次数就是\(sp ...
随机推荐
- DataGridView 绑定数据方法
DataGridView控件用于显示来自多种外部数据源中的数据,用户可以在此控件添加行和列,并可以填充数据. 如要让DataGridView显示数据库中的数据,只需要将此控件绑定到挑用数据库的数据 ...
- 第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例
apply和call apply和call都可以改变this的指向 函数的调用,改变this的指向 函数名字.apply(对象,[参数1,参数2,.....]) 方法名字.apply(对象,[参数1, ...
- [javaSE] 进制转换(二进制十进制十六进制八进制)
十进制转二进制,除2运算 十进制6转二进制是 110 (注意从右往左写,使用算式从下往上写) 二进制转十进制,乘2过程 二进制110转十进制 0*2的0次方+1*2的1次方+1*2的2次方=6 对 ...
- WCF4.0安装 NET.TCP启用及常见问题
WCF4.0安装及NET.TCP启用 WCF 4.0 一般默认安装.net Framework 4.0的时候已经安装. 但如果先装.net framework 4.0,后装IIS,就会出现问题.需要重 ...
- IDEA搭建普通java项目
初始化配置: 第一步:
- 代码实现SpringMvc
偶然看到一篇100多行实现SpringMvc的博客,阅读后整理加实现出来.大家共勉!(纸上得来终觉浅,绝知此事要躬行.) 实现Spring的部分. Bean工厂,统一创建Bean: IOC,实现Bea ...
- win下gosublime配置ctag
ctags(Generate tag files for source code)是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM.并且VIM中已经默认安装 ...
- 【C++并发实战】(一)并发基本概念
什么是并发 并发,最简单的理解就是,两个或者以上的活动同时进行.举个比较实际的例子,你可以手脚并用,两只手做不同的动作等等. 在计算机中的“并发”,是指一个系统可以同时执行多个独立的活动.在以前大多数 ...
- Ubuntu16.04(Linux)安装JDK
Ubuntu 安装JDK的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 第一种:使用ppa ...
- 前端面试题1(html)
HTML * Doctype作用?严格模式与混杂模式如何区分?它们有何意义? 1.<!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标 ...