CF797E Array Queries

本文介绍了洛谷竞赛题CF797E中如何使用根号分治方法解决ArrayQueries问题,涉及计算操作次数,适用于1<=n,q<=10^5的序列。文章详细解析了问题背景、算法步骤及时间复杂度。

CF797E Array Queries

洛谷CF797E Array Queries

题目大意

给定一个长度为 n n n的序列 a a a q q q次询问。

每次询问给出 p , k p,k p,k,你要不停地执行操作 p ← p + a p + k p\leftarrow p+a_p+k pp+ap+k,知道 p > n p>n p>n为止,并输出操作的次数。

1 ≤ n , q ≤ 1 0 5 , 1 ≤ a i ≤ n , 1 ≤ p , k ≤ n 1\leq n,q\leq 10^5,1\leq a_i\leq n,1\leq p,k\leq n 1n,q105,1ain,1p,kn


题解

前置知识:根号分治

我们发现,操作次数不超过 n − p k \dfrac{n-p}{k} knp,可以考虑根号分治。

k ≤ n k\leq \sqrt n kn 时,设 f i , j f_{i,j} fi,j表示 k = i , p = j k=i,p=j k=i,p=j时要跳几步才能使得 p > n p>n p>n,那么转移式为

f i , j = f i , j + a j + k + 1 f_{i,j}=f_{i,j+a_j+k}+1 fi,j=fi,j+aj+k+1

j + a j + k > n j+a_j+k>n j+aj+k>n时, f i , j = 1 f_{i,j}=1 fi,j=1

可以 O ( n n ) O(n\sqrt n) O(nn )处理出所有 f i , j f_{i,j} fi,j

k > n k>\sqrt n k>n 时,操作次数不超过 n − p k ≤ n \dfrac{n-p}{k}\leq \sqrt n knpn ,直接 O ( n ) O(\sqrt n) O(n )模拟即可。

总时间复杂度为 O ( ( n + q ) n ) O((n+q)\sqrt n) O((n+q)n )

code

#include<bits/stdc++.h>
using namespace std;
const int N=100000,B=320;
int n,q,ans,a[N+5],f[B+5][N+5];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=sqrt(n);i++){
		for(int j=n;j>=1;j--){
			if(j+a[j]+i>n) f[i][j]=1;
			else f[i][j]=f[i][j+a[j]+i]+1;
		}
	}
	scanf("%d",&q);
	for(int i=1,p,k;i<=q;i++){
		scanf("%d%d",&p,&k);
		if(k<=sqrt(n)) printf("%d\n",f[k][p]);
		else{
			ans=0;
			while(p<=n){
				p=p+a[p]+k;++ans;
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}
程序: import xarray as xr import matplotlib.pyplot as plt # 1. 加载 NetCDF 数据 cmip6_files = [r'E:\Except-Desktop\DC\CMIP6-download\historical-uo\uo_195001-201412.nc'] ds= xr.open_mfdataset(cmip6_files, engine='netcdf4', combine='by_coords') # 2. 打印数据信息,确认变量和维度 print(ds) # 3. 设置涠洲岛的经纬度范围(可调整) lon_min, lon_max = 108,109 lat_min, lat_max = 21, 22 # 4. 正确裁剪数据(使用 sel + slice) # 注意:CMIP6 数据通常是 1D lat/lon,所以直接切片即可 clipped = ds.sel(lat=slice(lat_min, lat_max), lon=slice(lon_min, lon_max)) if clipped.sizes['lat'] == 0 or clipped.sizes['lon'] == 0: raise ValueError("裁剪后经纬度维度为空,请检查裁剪范围是否在数据范围内。") # 5. 打印裁剪后的数据 print(clipped) # 7. 可选:保存裁剪后的数据 clipped.to_netcdf(r'E:\Except-Desktop\DC\CMIP6-download\historical-uo\uo_c1.nc') 输出: Dimensions: (time: 780, bnds: 2, lev: 61, y: 362, x: 360, vertices: 4) Coordinates: * time (time) datetime64[ns] 6kB 1950-01-16T12:00:00 ... 201... * lev (lev) float64 488B 1.0 3.5 6.5 ... 6.15e+03 6.525e+03 * y (y) float64 3kB -77.75 -77.25 -76.75 ... 150.8 152.9 * x (x) float64 3kB 0.5 1.5 2.5 3.5 ... 357.5 358.5 359.5 latitude (y, x) float64 1MB dask.array<chunksize=(362, 360), meta=np.ndarray> longitude (y, x) float64 1MB dask.array<chunksize=(362, 360), meta=np.ndarray> Dimensions without coordinates: bnds, vertices Data variables: time_bnds (time, bnds) datetime64[ns] 12kB dask.array<chunksize=(1, 2), meta=np.ndarray> lev_bnds (lev, bnds) float64 976B dask.array<chunksize=(61, 2), meta=np.ndarray> y_bnds (y, bnds) float64 6kB dask.array<chunksize=(362, 2), meta=np.ndarray> x_bnds (x, bnds) float64 6kB dask.array<chunksize=(360, 2), meta=np.ndarray> vertices_latitude (y, x, vertices) float64 4MB dask.array<chunksize=(362, 360, 2), meta=np.ndarray> vertices_longitude (y, x, vertices) float64 4MB dask.array<chunksize=(362, 360, 2), meta=np.ndarray> uo (time, lev, y, x) float32 25GB dask.array<chunksize=(1, 21, 181, 180), meta=np.ndarray> Attributes: (12/43) Conventions: CF-1.7 CMIP-6.2 activity_id: CMIP branch_method: standard branch_time_in_child: 0.0 branch_time_in_parent: 0.0 creation_date: 2019-11-14T19:50:51Z ... ... title: MRI-ESM2-0 output prepared for CMIP6 variable_id: uo variant_label: r1i1p1f1 license: CMIP6 model data produced by MRI is licensed unde... cmor_version: 3.5.0 tracking_id: hdl:21.14100/f4396e2f-71b2-4ff5-beee-30bb338e813c Traceback (most recent call last): File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\DC-run\8.27程序包\裁剪空间.py", line 17, in <module> clipped = ds.sel(lat=slice(lat_min, lat_max), lon=slice(lon_min, lon_max)) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\dataset.py", line 2911, in sel query_results = map_index_queries( File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 187, in map_index_queries grouped_indexers = group_indexers_by_index(obj, indexers, options) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 148, in group_indexers_by_index raise KeyError( KeyError: "'lat' is not a valid dimension or coordinate for Dataset with dimensions FrozenMappingWarningOnValuesAccess({'time': 780, 'bnds': 2, 'lev': 61, 'y': 362, 'x': 360, 'vertices': 4})"
09-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值