洛谷 P3203 [HNOI2010]弹飞绵羊 分块
2024-08-30 07:16:51
我们只需将序列分成 n\sqrt{n}n 块,对于每一个点维护一个 val[i]val[i]val[i],to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号。在查询时,我们最多会跳 n\sqrt{n}n 块,修改的时候将节点所在区间暴力修改即可。
Code:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 2000000 + 3;
int arr[maxn], n, block, to[maxn], val[maxn], m, belong[maxn];
struct Data_Structure{
inline void init(){
block = sqrt(n);
for(int i = n;i >= 1; --i)
{
belong[i] = (i - 1) / block + 1;
to[i] = belong[i + arr[i]] == belong[i] ? to[i + arr[i]] : i + arr[i];
val[i] = belong[i + arr[i]] == belong[i] ? val[i + arr[i]] + 1 : 1;
}
}
inline int solve(){
int pos, ans = 0;
scanf("%d",&pos);
++pos;
while(pos <= n){
ans += val[pos];
pos = to[pos];
}
return ans;
}
inline void update(){
int pos, data;
scanf("%d%d",&pos,&data);
++pos;
arr[pos] = data;
for(int i = min(belong[pos] * block, n); i >= (belong[pos] - 1) * block + 1; --i)
{
to[i] = belong[i + arr[i]] == belong[i] ? to[i + arr[i]] : i + arr[i];
val[i] = belong[i + arr[i]] == belong[i] ? val[i + arr[i]] + 1 : 1;
}
}
}T;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n; ++i) scanf("%d",&arr[i]);
T.init();
scanf("%d",&m);
while(m--)
{
int opt;
scanf("%d",&opt);
switch(opt)
{
case 1:
{
printf("%d\n", T.solve());
break;
}
case 2:
{
T.update();
break;
}
}
}
return 0;
}
最新文章
- sc.WholeTextFiles与sc.textFile区别
- SQL查询包含汉字的行
- Oracle数据库基础知识_字符串操作相关2
- JQuery动态增加删除元素
- Linux epoll总结
- PMP:6.项目进度管理
- 异常处理汇总 ~ 修正果带着你的Code飞奔吧!
- ubuntu 禁用自带的nouveau显卡驱动,安装NVIDIA显卡驱动
- webpack 打包产生的文件名中,hash、chunkhash、contenthash 的区别
- encode()、decode()字符编码问题
- 028 Partitioner:数据分区器
- EBS管理员为供应商创建新联系人流程
- (回文串 Manacher )Girls&#39; research -- hdu -- 3294
- (转)解决dubbox-demo-provider.xml报错的问题:提示Failed to read schema document
- GO_00:Mac之Item2的配置安装
- 给洛谷填坑的spj……
- MySQL order null 0 - 把null和0(零)排在最后
- 简单的 Android 菜单
- HDU 6280 From Tree to Graph(2018 湘潭邀请 E题,树的返祖边)
- KM算法讲解
热门文章
- c# rc4算法,加密解密类
- 【摘录】JAVA内存管理-自动选择垃圾收集器算法
- Codeforces Round #284 (Div. 2) A
- 一个APP开发有那么难吗?
- Python安装遇到的问题
- BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)
- linux内核(四)内存管理单元MMU
- LeetCode104_MaximumDepthofBinaryTree Java题解
- HDU 4336
- 强名称程序集(strong name assembly)——为程序集赋予强名称