P3203 弹飞绵羊-分块

观察数据范围,发现可以分块。只需要处理每个点跳出所在块后的位置和次数即可。目的是为了加速查询并降低修改复杂度。

对于修改,重构整个块内信息即可。

时间复杂度正确的一批

具体实现也挺简单。注意重构时从后往前贡献即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=2e5+10;
int n,N,out[maxn],cos[maxn],a[maxn],belong[maxn],l[maxn],r[maxn];
void sudo(int l,int r){for(int i=r;i>=l;i--)if(i+a[i]>n or belong[i+a[i]]!=belong[i])out[i]=i+a[i],cos[i]=1;else out[i]=out[i+a[i]],cos[i]=1+cos[i+a[i]];}
inline void work(){
n=read();
N=sqrt(n);
for(int i=1;i<=n;i++)
belong[i]=(i-1)/N+1;
for(int i=1;i<=n;i++){
if(!l[belong[i]])l[belong[i]]=i;
r[belong[i]]=i;
}
for(int i=1;i<=n;i++)a[i]=read();
sudo(1,n);
int q=read();
while(q--){
if(read()==1){
int sum=0,pos=read()+1;
while(pos<=n)sum+=cos[pos],pos=out[pos];
printf("%d\n",sum);
}else{
int pos=read()+1;
a[pos]=read();
sudo(l[belong[pos]],r[belong[pos]]);
}
}
}
}
signed main(){
star::work();
return 0;
}

那我要是想知道最后弹飞前的点在哪呢?

我们只需要在重构的时候记录一下从哪来的就好了。

双倍经验:CF13E

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=2e5+10;
int n,N,out[maxn],last[maxn],cos[maxn],a[maxn],belong[maxn],l[maxn],r[maxn];
void sudo(int l,int r){for(int i=r;i>=l;i--)if(i+a[i]>min(n,r))out[i]=i+a[i],last[i]=i,cos[i]=1;else out[i]=out[i+a[i]],last[i]=last[i+a[i]],cos[i]=1+cos[i+a[i]];}
inline void work(){
n=read();
int q=read();
N=sqrt(n);
for(int i=1;i<=n;i++)
belong[i]=(i-1)/N+1;
for(int i=1;i<=n;i++){
if(!l[belong[i]])l[belong[i]]=i;
r[belong[i]]=i;
}
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=belong[n];i++)sudo(l[i],r[i]);
while(q--){
if(read()==1){
int sum,pos,lpos;
sum=0,pos=lpos=read();
while(pos<=n)sum+=cos[pos],lpos=last[pos],pos=out[pos];
printf("%d %d\n",lpos,sum);
}else{
int pos=read();
a[pos]=read();
sudo(l[belong[pos]],r[belong[pos]]);
}
}
}
}
signed main(){
star::work();
return 0;
}

P3203 弹飞绵羊-分块的更多相关文章

  1. 【BZOJ 2002】【Hnoi 2010】弹飞绵羊 分块||Link Cut Tree 两种方法

    ShallWe,Yveh,hmy,DaD3zZ,四人吃冰糕从SLYZ超市出来后在马路上一字排开,,,吃完后发现冰糕棍上写着:“向狮子座表白:愿做你的小绵羊”,,, 好吧在这道题里我们要弹飞绵羊,有分块 ...

  2. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

  3. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  4. BZOJ 2002 Bounce 弹飞绵羊 (分块或动态树)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 13768  Solved: 6989[Subm ...

  5. [HNOI2010] 弹飞绵羊 (分块)

    [HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ...

  6. 【BZOJ2002】【HNOI2010】弹飞绵羊 [分块]

    弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一 ...

  7. BZOJ 2002 Bounce 弹飞绵羊 —— 分块算法

    题目链接:https://vjudge.net/problem/HYSBZ-2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Li ...

  8. 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊 分块/LCT

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  9. bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

随机推荐

  1. pycham_编码格式设置,处理打印log乱码,处理读取配置文件报错

    一.打印日志乱码,处理设置如下: 二.配置文件读取方法因为gbk编码配置后需要同步修改 原报错信息:

  2. 『言善信』Fiddler工具 — 7、统计选项页详解(Statistics)

    目录 1.Statistics选项页介绍 2.Statistics界面内容说明 3.Statistics选项页底部图表说明 1.Statistics选项页介绍 Statistics 页签显示当前用户选 ...

  3. 实验6、Flask API使用示例和拓展

    实验介绍 1. 实验内容 Flask 提供了多种API拓展,本节我们主要学习基于RESTful的Flask应用程序设计 2. 实验要点 学习和掌握多种RESTful的设计模式 3.实验环境 Cento ...

  4. 如何下载安装Python

     github博客传送门 csdn博客传送门 如何下载安装python 第一步: 在python的官网下载python版本,需要下载对应版本(在计算机-属性中查看自己是32位操作系统还是64位操作系统 ...

  5. 『心善渊』Selenium3.0基础 — 5、XPath路径表达式详细介绍

    目录 1.XPath介绍 2.什么是XML 3.XML与HTML对比 4.为什么使用XPath定位页面中的元素 5.XPath中节点之间的关系 (1)节点的概念 (2)节点之间的关系类型 6.XPat ...

  6. Linux网络命令与脚本使用

    作为系统管理员,经常需要诊断和解决网络问题,而配置.监控与保护网络有助于发现问题并在事情范围扩大前得意解决,并且网络的性能与安全也是管理与诊断网络的重要部分.这里总结一下常用与Linux网络管理的命令 ...

  7. 源码搭建Zabbix4.0.23LTS监控系统

    实验环境 centos 7.5 主机名 IP地址 配置 应用 controlnode 172.16.1.120/24 4核/8G/60G java-1.8.0-openjdk zabbix serve ...

  8. 24、dhcp服务搭建

    1.dhcp介绍: DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,DHCP 协议主要是用来自动为局域网中的客户机分配 TCP/IP 信息的网络协 ...

  9. 【知识点】C++的日志框架

    常用的 C++ 日志框架 一.日志框架 一个经过专门设计的实用程序,用于规范应用程序的日志记录过程,就是日志框架.   日志框架可以自己编写(需要一定的能力哦),也可以由第三方(例如:log4cplu ...

  10. 基于uni-app全端弹框组件uaPopup「兼容h5+小程序+app端|nvue」

    uniapp兼容多端自定义模态弹框组件UAPopup ua-popup 一款轻量级的uniapp自定义弹窗组件.汇集了android.ios和微信弹窗效果(msg消息.alert提示框.dialog对 ...