P3203 弹飞绵羊-分块
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 弹飞绵羊-分块的更多相关文章
- 【BZOJ 2002】【Hnoi 2010】弹飞绵羊 分块||Link Cut Tree 两种方法
ShallWe,Yveh,hmy,DaD3zZ,四人吃冰糕从SLYZ超市出来后在马路上一字排开,,,吃完后发现冰糕棍上写着:“向狮子座表白:愿做你的小绵羊”,,, 好吧在这道题里我们要弹飞绵羊,有分块 ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- BZOJ 2002 Bounce 弹飞绵羊 (分块或动态树)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 13768 Solved: 6989[Subm ...
- [HNOI2010] 弹飞绵羊 (分块)
[HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ...
- 【BZOJ2002】【HNOI2010】弹飞绵羊 [分块]
弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一 ...
- BZOJ 2002 Bounce 弹飞绵羊 —— 分块算法
题目链接:https://vjudge.net/problem/HYSBZ-2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Li ...
- 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊 分块/LCT
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
随机推荐
- java后端知识点梳理——java集合
集合概览 Java中的集合,从上层接口上看分为了两类,Map和Collection.Map是和Collection并列的集合上层接口,没有继承关系. Java中的常见集合可以概括如下. Map接口和C ...
- 1、java语言概述
Java基础知识图解 软件开发 软件开发 软件,即一系列按照特定顺序组织的计算机数据和指令的集合.有系统软件和应用软件之分. 人机交互方式 图形化界面(Graphical User Interface ...
- JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)
好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...
- 合宙Luat | Cat.1 Socket数据收不到?学会两招不掉线
1 服务器收不到Socket数据的原因 Socket是大家使用Cat.1模块常用的功能之一,但Cat.1模块不是直接跟服务器连接,而是通过NAT(即网络地址转换)与服务器连接. 一个会话建立后会在NA ...
- codeforeces 845B
题解 codefores 845B 原题 Luba has a ticket consisting of 6 digits. In one move she can choose digit in a ...
- Mysql优化(出自官方文档) - 第二篇
Mysql优化(出自官方文档) - 第二篇 目录 Mysql优化(出自官方文档) - 第二篇 1 关于Nested Loop Join的相关知识 1.1 相关概念和算法 1.2 一些优化 1 关于Ne ...
- Kafka 总结学习
Kafka Need No Keeper 最近在鹅厂工作中不断接触到Kafka,虽然以前也使用过,但是对其架构和发展过程总是模模糊糊,所以在回学校准备末考的时候找些资料总结一下. Kafka Need ...
- 生成工作区设置文件settings.json
先Ctrl+Shift+P,然后输入setting搜索 找到工作区设置(工作区,仅在当前打开的界面下生效,文档位置与根目录/.vscode/setting.json(可自己创建,也可不创建)) 选择之 ...
- 远程代码执行MS08-067漏洞复现失败过程
远程代码执行MS08-067漏洞复现失败过程 漏洞描述: 如果用户在受影响的系统上收到特制的 RPC 请求,则该漏洞可能允许远程执行代码. 在微软服务器系统上,攻击者可能未经身份验证即可利用此漏洞运行 ...
- 创建Cloudflare CDN
背景说明: XX全球版项目CDN, 原有改之前:主CDN为Akamai,备CDN为Cloudflare. 计划改之后:主CDN为Cloudflare,备CDN为Akamai. 原因:Akamai CD ...