首页 > 其他分享 >CF-797-E-根号分治

CF-797-E-根号分治

时间:2024-05-04 11:55:34浏览次数:16  
标签:797 pre int 复杂度 CF sqrt cin 根号

797-E 题目大意

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

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

Solution

考虑两种思路:

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

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

两个算法单独使用任何一个复杂度都过高,因此考虑结合使用,预处理出所有\(k \le \sqrt{n}\)的情形,回答询问时:

  • 如果\(k \le \sqrt{n}\),则直接用预处理的值回答询问。
  • 如果\(k > \sqrt{n}\),则暴力模拟。

时间复杂度:\(O((n+q) \sqrt{n})\),空间复杂度:\(O(n \sqrt{n})\)。

#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;
}

标签:797,pre,int,复杂度,CF,sqrt,cin,根号
From: https://www.cnblogs.com/fengxue-K/p/18172151

相关文章

  • CF1968E.Cells Arrangement-构造(给个和题解不同的做法)
    link:https://codeforces.com/problemset/problem/1968/E题意:需要构造一个\(n\timesn\)的棋盘,在上面放\(n\)枚棋子,设集合\(\mathcal{H}\)表示两两之间曼哈顿距离构成的集合,要让\(|\mathcal{H}|\)最大。给出放棋子的方案。首先说说题解的做法…考虑把距离为奇数和偶数的......
  • CF940F.Machine Learning-带修莫队、Mex
    给一个序列\(a\),两个操作:1、给\(l,r\),设\(a_l,\dots,a_r\)这些数集中每个数\(v\)的出现次数是\(c_v\),要求\(\mathrm{mex}(c_i)\).2、单点修改\(1\leqn,q\leq10^5\),时限4s这种一眼看过去很难维护的信息,一般就先找找性质。首先注意到关键性质:要求的是出现次数......
  • 题解:CF1926G
    题目传送门思路发现权值为C的点可以选择看做是权值为S或为P的点,所以问题转换为怎么给C点赋值可以使答案最小,考虑树形dp。\(f_{i,0/i,1}\)表示\(i\)点赋值为S或P时最少要删除几条边。但如果当前点权值不为C的话,那显然他的父亲节点应该选择和他权值相同的点才......
  • CF941
    Alink其实,只要有第一次,那么下次随意找一个队列里有的数加\(k-1\)个进去,加上队列里那一个删掉\(k\)个,到最后一次肯定是剩\(k-1\)个。没有第一次,就是\(n\)。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intt;intn,k;inta[105];intmp[105];voidqwq......
  • CF-943(已更B-E)
    CF-943(已更B-E)D赛时没调出来(╬▔皿▔)╯,还有几分钟的时候反而把E过了,本来应该是上大分一场(⊙﹏⊙),等会会补G1这假期要刷题,还要补文化课……后面有空的话更一下之前打的线下赛的题解B双指针……voidsolve(){ intn,m;cin>>n>>m; stringa,b;cin>>a>>b; intnow=0......
  • CF1950 A~G
    前言报了名没打的一场Div.4,我是怎么想到回去做的呢?上课的时候无聊于是随机了一道1700的题,找到了本场比赛的F题,我那时还没发现。过了差不多\(2\sim3\)天去随机了一道1900,又找到了G题,一看G题竟然只有1900,意识到这是Div.4,就想着AK一场Div.4,结果发现F做过了,这......
  • 题解:CF607E Cross Sum
    Problem给定\(N\)条不平行的直线\(y=\frac{k_i}{1000}x+\frac{b_i}{1000}\),\(N\)条直线总共会有\(\frac{N(N-1)}{2}\)个交点(包含在同一个位置的点,即相同位置算不同的点),找出距离原点前\(K\)近的交点的距离和。$2\leN\le5\times10^4$,\(1\leK\le\frac{N(N-1)}{2}\)......
  • 对于 CF1107E 中 dp 状态设计的一点想法
    不太想发到洛谷讨论区,就往这里放了。我觉得现有的题解都没说明白为什么本题的状态和转移能覆盖所有情况,并且感觉也非常不自然,没见过的话感觉挺难发现这么一个东西。然而这个dp其实是可以自然地推导出来的。首先发现这个过程非常难以描述,主要原因在于很难刻画一个局面。然而,如......
  • CF85E Guard Towers
    CF85EGuardTowers二分+二分图看到最大值最小,考虑二分。二分距离最大值,限制了某些点对不能分到同一组,明显的二分图模型。用这些限制条件建图,跑二分图染色,看是否能分为二分图即可。考虑方案数的计算,题目中方案数不同的要求是第一组的集合不同就为不同方案,所以跑完二分图后,图分......
  • CF241E Flights
    CF241EFlights边权转点权+差分约束显然图中不在\(1\)到\(n\)路径上的边是不会影响答案的,所以现在只考虑\(1\)到\(n\)路径上的边。然后就有重要性质,图中\(1\)到\(n\)的所有路径的航程相同可以转化为,对于每个在\(1\)到\(n\)某条路径上的\(u\),都有\(1\)到\(u......