E. Array Queries

本文介绍了一种使用动态规划(DP)解决特定查询问题的方法。对于参数K大于400的情况,通过简单的迭代即可快速得出结果;而对于K小于400的情形,则采用预处理的方式进行DP计算,有效降低整体时间复杂度。

主要是部分DP的思想
我们可以这样想,当K大于400的时候,不需要几步我们就能跳出N的范围了。当K小于400的时候虽然很慢,但是我们可以先预处理出来。用DP来处理,复杂度就只有Q*400,这样总的复杂度就能保证了。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>

#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define mem(i,a) memset(i,a,sizeof(i))
#define rson mid+1,r,rt<<1|1
#define lson l,mid,rt<<1

#define mp make_pair
#define pb push_back
#define ll long long
#define LL long long
using namespace std;
template <typename T>inline void read(T &_x_){
    _x_=0;bool f=false;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=!f;ch=getchar();}
    while ('0'<=ch&&ch<='9') {_x_=_x_*10+ch-'0';ch=getchar();}
    if(f) _x_=-_x_;
}
const double eps = 1e-8;
const int maxn = 1e5+7;
const int mod = 1e9+7;
const ll inf = 1e15;

int n,q;
struct node{
    int l,r;
}b[maxn];
int a[maxn];
int dp[maxn][400];

int main(){
    read(n);
    FOR(i,1,n) read(a[i]);

    read(q);
    FOR(i,1,q){
        int x,y;
        read(x),read(y);
        if(y>=400){
            int p=x,cnt=0;
            while(p<=n){
                p=p+a[p]+y;
                cnt++;
            }
            printf("%d\n",cnt);
        }else{
            if(dp[x][y]==0)
            for(int i=n;i>=1;i--){
                if(i+a[i]+y>n) dp[i][y]=1;
                else dp[i][y]=dp[i+a[i]+y][y]+1;
            }
            printf("%d\n",dp[x][y]);
        }
    }
    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
程序: import xarray as xr import matplotlib.pyplot as plt # 1. 加载 NetCDF 数据 cmip6_files = [r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_195001-196912.nc', r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_197001-198912.nc', r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_199001-200912.nc', r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_201001-201412.nc'] ds= xr.open_mfdataset(cmip6_files, engine='netcdf4', combine='by_coords') # 2. 打印数据信息,确认变量和维度 print(ds) print("Dimensions:", ds.dims) print("Coordinates:", ds.coords) print("dissic dimensions:", ds['dissic'].dims) # 3. 设置涠洲岛的经纬度范围(可调整) lon_min, lon_max = 108.5,110.5 lat_min, lat_max = 20.5, 22.5 # 4. 正确裁剪数据(使用 sel + slice) # 注意:CMIP6 数据通常是 1D lat/lon,所以直接切片即可 clipped = ds.sel(latitude=slice(lat_min, lat_max), longitude=slice(lon_min, lon_max)) if clipped.sizes['latitude'] == 0 or clipped.sizes['longitude'] == 0: raise ValueError("裁剪后经纬度维度为空,请检查裁剪范围是否在数据范围内。") # 5. 打印裁剪后的数据 print(clipped) # 7. 可选:保存裁剪后的数据 clipped.to_netcdf(r'E:\Except-Desktop\DC\CMIP6-download\historical-dissic\dissic_c1.nc') 输出: <xarray.Dataset> Size: 22GB Dimensions: (time: 780, bnds: 2, lev: 50, i: 292, j: 362, vertices: 4) Coordinates: * time (time) object 6kB 1950-01-16 12:00:00 ... 2014-12-16 ... * lev (lev) float64 400B 0.5126 1.621 ... 5.498e+03 5.904e+03 * i (i) int32 1kB 0 1 2 3 4 5 6 ... 286 287 288 289 290 291 * j (j) int32 1kB 0 1 2 3 4 5 6 ... 356 357 358 359 360 361 latitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray> longitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray> Dimensions without coordinates: bnds, vertices Data variables: time_bnds (time, bnds) object 12kB dask.array<chunksize=(1, 2), meta=np.ndarray> lev_bnds (time, lev, bnds) float64 624kB dask.array<chunksize=(240, 50, 2), meta=np.ndarray> vertices_latitude (time, i, j, vertices) float64 3GB dask.array<chunksize=(240, 292, 362, 4), meta=np.ndarray> vertices_longitude (time, i, j, vertices) float64 3GB dask.array<chunksize=(240, 292, 362, 4), meta=np.ndarray> dissic (time, lev, i, j) float32 16GB dask.array<chunksize=(1, 25, 146, 181), meta=np.ndarray> Attributes: (12/48) 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 comment: none ... ... title: CMCC-ESM2 output prepared for CMIP6 variable_id: dissic variant_label: r1i1p1f1 license: CMIP6 model data produced by CMCC is licensed und... cmor_version: 3.6.0 tracking_id: hdl:21.14100/bee4bdb7-33d9-4526-add3-8e1f02ec1c16 Dimensions: FrozenMappingWarningOnValuesAccess({'time': 780, 'bnds': 2, 'lev': 50, 'i': 292, 'j': 362, 'vertices': 4}) Coordinates: Coordinates: * time (time) object 6kB 1950-01-16 12:00:00 ... 2014-12-16 12:00:00 * lev (lev) float64 400B 0.5126 1.621 2.858 ... 5.498e+03 5.904e+03 * i (i) int32 1kB 0 1 2 3 4 5 6 7 ... 284 285 286 287 288 289 290 291 * j (j) int32 1kB 0 1 2 3 4 5 6 7 ... 354 355 356 357 358 359 360 361 latitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray> longitude (i, j) float64 846kB dask.array<chunksize=(292, 362), meta=np.ndarray> dissic dimensions: ('time', 'lev', 'i', 'j') Traceback (most recent call last): File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\DC-run\8.27程序包\裁剪空间.py", line 23, in <module> clipped = ds.sel(latitude=slice(lat_min, lat_max), longitude=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 146, in group_indexers_by_index raise KeyError(f"no index found for coordinate {key!r}") KeyError: "no index found for coordinate 'latitude'"
08-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值