[luoguP2617] Dynamic Ranking(树状数组 套 主席树 + 离散化)

传送门

 

BZOJ上是权限题,洛谷赞啊。

求区间 K 大数很简单。

但是如果修改某个数的话,那么就得把这个数及后面所建的主席树都更新一遍 nlogn,显然不行。

所以可以在外面套一个树状数组来优化,树状数组的每一个节点都表示某个区间的主席树。

所以可以通过树状数组来求前缀和主席树。

具体实现看代码。

 

——代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 const int MAXN = 20005;
 6 int n, m, tot, cnt, size, t1, t2;
 7 int a[MAXN], b[MAXN], x[MAXN], y[MAXN], z[MAXN], q1[MAXN], q2[MAXN], root[MAXN], ls[MAXN * 100], rs[MAXN * 100], sum[MAXN * 100];
 8 char s[MAXN];
 9 
10 inline int read()
11 {
12     int x = 0;
13     char ch = getchar();
14     for(; !isdigit(ch); ch = getchar());
15     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
16     return x;
17 }
18 
19 inline void insert(int &now, int l, int r, int x, int v)
20 {
21     if(!now) now = ++cnt;
22     sum[now] += v;
23     if(l == r) return;
24     int mid = (l + r) >> 1;
25     if(x <= mid) insert(ls[now], l, mid, x, v);
26     else insert(rs[now], mid + 1, r, x, v);
27 }
28 
29 inline int query(int l, int r, int x)
30 {
31     if(l == r) return l;
32     int i, mid = (l + r) >> 1, ans = 0;
33     for(i = 1; i <= t1; i++) ans -= sum[ls[q1[i]]];
34     for(i = 1; i <= t2; i++) ans += sum[ls[q2[i]]];
35     if(x <= ans)
36     {
37         for(i = 1; i <= t1; i++) q1[i] = ls[q1[i]];
38         for(i = 1; i <= t2; i++) q2[i] = ls[q2[i]];
39         return query(l, mid, x);
40     }
41     else
42     {
43         for(i = 1; i <= t1; i++) q1[i] = rs[q1[i]];
44         for(i = 1; i <= t2; i++) q2[i] = rs[q2[i]];
45         return query(mid + 1, r, x - ans);
46     }
47 }
48 
49 int main()
50 {
51     int i, j, l, r;
52     n = read();
53     m = read();
54     for(i = 1; i <= n; i++) a[i] = read(), b[++tot] = a[i];
55     for(i = 1; i <= m; i++)
56     {
57         for(s[i] = getchar(); s[i] != 'Q' && s[i] != 'C'; s[i] = getchar());
58         if(s[i] == 'C') x[i] = read(), z[i] = read(), b[++tot] = z[i];
59         else x[i] = read(), y[i] = read(), z[i] = read();
60     }
61     
62     std::sort(b + 1, b + tot + 1);
63     size = std::unique(b + 1, b + tot + 1) - (b + 1);
64     for(i = 1; i <= n; i++) a[i] = std::lower_bound(b + 1, b + size + 1, a[i]) - b;
65     for(i = 1; i <= m; i++)
66         if(s[i] == 'C')
67             z[i] = std::lower_bound(b + 1, b + size + 1, z[i]) - b;
68     
69     for(i = 1; i <= n; i++)
70         for(j = i; j <= size; j += j & -j)
71             insert(root[j], 1, size, a[i], 1);
72     
73     for(i = 1; i <= m; i++)
74         if(s[i] == 'Q')
75         {
76             t1 = t2 = 0;
77             for(j = x[i] - 1; j; j -= j & -j) q1[++t1] = root[j];
78             for(j = y[i]; j; j -= j & -j) q2[++t2] = root[j];
79             printf("%d\n", b[query(1, size, z[i])]);
80         }
81         else 
82         {
83             for(j = x[i]; j <= size; j += j & -j) insert(root[j], 1, size, a[x[i]], -1);
84             a[x[i]] = z[i];
85             for(j = x[i]; j <= size; j += j & -j) insert(root[j], 1, size, z[i], 1);
86         }
87     return 0;
88 }
View Code

 

转载于:https://www.cnblogs.com/zhenghaotian/p/6878964.html

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值