CF-797-E-根号分治

797-E 题目大意

给定一个长为n序列a,有q次询问:

  • 给定p,k,你需要反复执行操作p=p+ap+k,直到p>n为止,问你要执行多少次操作。

Solution

考虑两种思路:

1、暴力回答询问,每次反复模拟操作,直到p>n为止,时间复杂度O(q·nk)

2、预处理出所有的p,k对应的操作次数,直接O(1)回答询问,时间复杂度O(nk)

两个算法单独使用任何一个复杂度都过高,因此考虑结合使用,预处理出所有kn的情形,回答询问时:

  • 如果kn,则直接用预处理的值回答询问。
  • 如果k>n,则暴力模拟。

时间复杂度:O((n+q)n),空间复杂度:O(nn)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e5+10;
const int M=350;
int pre[N][M];
int a[N];

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	int B=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=n;i;i--){
		for(int j=1;j<=B;j++){
			if(i+a[i]+j>n) pre[i][j]=1;
			else pre[i][j]=pre[i+a[i]+j][j]+1;
		}
	}
	int q;
	cin>>q;
	while(q--){
		int p,k;
		cin>>p>>k;
		if(k<=B){
			cout<<pre[p][k]<<'\n';
		}else{
			int res=0;
			while(p<=n){
				res++;
				p+=a[p]+k;
			}
			cout<<res<<'\n';
		}
	}
	return 0;
}
posted @   fengxue-K  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示