luogu 2617
动态区间 $k$ 大
主席树 + 树状数组
树状数组的每个点对应一颗线段树
首先将所有点加入数据结构
枚举 x
code: for(int i = x; i <= n; i += Lowbit(i)) Poi_G(root[i], 1, Length, k, val);
区间修改时
将所有的后缀树的相应位置 -1, 再 +1
主席树查询时
在计算区间和的时候
类似树状数组的查询
将用到的线段树的相应节点加或减
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string> using namespace std; #define LL long long #define gc getchar()
inline int read() {int x = ; char c = gc; while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
inline LL read_LL() {LL x = ; char c = gc; while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
#undef gc const int N = 1e5 + ; struct Node {int opt, l, r, k;} Ask[N]; int n, m;
int A[N], Num[N << ], Length; int root[N], Lson[N * ], Rson[N * ], W[N * ];
int root_add[], root_cut[];
int jsadd, jscut; int Lowbit(int x) {return (x & (-x));} int Hjt; void Poi_G(int &rt, int l, int r, int k, int val) {
if(!rt) rt = ++ Hjt;
W[rt] += val;
if(l == r) return ;
int mid = (l + r) >> ;
if(k <= mid) Poi_G(Lson[rt], l, mid, k, val);
else Poi_G(Rson[rt], mid + , r, k, val);
} void Pre_Poi_G(int x, int val) {
int k = lower_bound(Num + , Num + Length + , A[x]) - Num;
for(int i = x; i <= n; i += Lowbit(i)) Poi_G(root[i], , Length, k, val);
} int Sec_A(int l, int r, int k) {
if(l == r) return l;
int sum = ;
for(int i = ; i <= jsadd; i ++) sum += W[Lson[root_add[i]]];
for(int i = ; i <= jscut; i ++) sum -= W[Lson[root_cut[i]]];
int mid = (l + r) >> ;
if(k <= sum) {
for(int i = ; i <= jsadd; i ++) root_add[i] = Lson[root_add[i]];
for(int i = ; i <= jscut; i ++) root_cut[i] = Lson[root_cut[i]];
return Sec_A(l, mid, k);
} else {
for(int i = ; i <= jsadd; i ++) root_add[i] = Rson[root_add[i]];
for(int i = ; i <= jscut; i ++) root_cut[i] = Rson[root_cut[i]];
return Sec_A(mid + , r, k - sum);
}
} int Pre_Sec_A(int l, int r, int k) {
memset(root_add, , sizeof root_add);
memset(root_add, , sizeof root_add);
jsadd = jscut = ;
for(int i = r; i; i -= Lowbit(i)) root_add[++ jsadd] = root[i];
for(int i = l - ; i; i -= Lowbit(i)) root_cut[++ jscut] = root[i];
return Sec_A(, Length, k);
} int main() {
n = read(), m = read();
for(int i = ; i <= n; i ++) A[i] = read(), Num[++ Length] = A[i];
for(int i = ; i <= m; i ++) {
char c[]; scanf("%s", c);
Ask[i].opt = (c[] == 'Q' ? : );
if(Ask[i].opt == ) Ask[i].l = read(), Ask[i].r = read(), Ask[i].k = read();
else {Ask[i].l = read(), Ask[i].k = read(), Num[++ Length] = Ask[i].k;}
}
sort(Num + , Num + Length + );
Length = unique(Num + , Num + Length + ) - Num - ;
for(int i = ; i <= n; i ++) Pre_Poi_G(i, );
for(int i = ; i <= m; i ++) {
if(Ask[i].opt == ) {
int Ans = Num[Pre_Sec_A(Ask[i].l, Ask[i].r, Ask[i].k)];
printf("%d\n", Ans);
} else {
Pre_Poi_G(Ask[i].l, -);
A[Ask[i].l] = Ask[i].k;
Pre_Poi_G(Ask[i].l, );
}
}
return ;
}
luogu 2617的更多相关文章
- Luogu Dynamic Ranking (带修改的主席树)
题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- [luogu P2647] 最大收益(贪心+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...
- YTU 2617: B C++时间类的运算符重载
2617: B C++时间类的运算符重载 时间限制: 1 Sec 内存限制: 128 MB 提交: 284 解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...
- Luogu 考前模拟Round. 1
A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...
- luogu P2580 于是他错误的点名开始了
luogu P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
随机推荐
- UNIX环境高级编程笔记 目录
每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...
- 《C++语言程序设计》初学者必备教材
很多刚开始学习C++语言的同学,都会遇到一个问题:很多教材都不适合零基础的初学者.它们有的枯燥乏味,让人难以消化吸收,有的层次结构混乱,很难理清楚知识点,有的更是难度太大,没有代码的过渡,就开始讲解算 ...
- pb笔记之数据窗口设置操作
1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Pro ...
- Gitlab服务不能启动postgresql
源博文:http://www.zxmseed.com/blog/911081 1.查看启动的服务 -sh-4.1$ gitlab-ctl status warning: gitlab-workhors ...
- LOJ3049 [十二省联考2019] 字符串问题 【后缀自动机】【倍增】【拓扑排序】
题目分析: 建出后缀自动机,然后把A串用倍增定位到后缀自动机上,再把B串用倍增定位到后缀自动机上. SAM上每个点上的A串根据长度从小到大排序,建点,依次连边. 再对于SAM上面每个点,连到儿子的边, ...
- 怎样获取当前页面框架的数量(即iframe和frame的数量)
需要使用window.length, 或者window.frames.length; 如果页面中不包含frame和iframe元素, 则返回0; window.length === window.fr ...
- 在Windows平台搭建C语言开发环境
一.在Windows平台搭建DEV C++集成开发环境 官网 https://sourceforge.net/projects/orwelldevcpp/ 中下载Dev C++运行即可 环境准 ...
- LunHui 的生命观
LunHui 的生命观 来源 https://www.zhihu.com/question/346510295 作者:齐天大圣链接:https://www.zhihu.com/question/346 ...
- Ubuntu install android studio
Ubuntu install android studio 1. 安装 openjdk8,并在配置文件 /etc/profile 中,追加如下内容: sudo aptitude install ope ...
- 使用Feign通过服务名调用服务,找不到服务
fegineureka 报错环境: eureka注册中心在远程服务器上 本地服务注册到远程的eureka注册中心 本地服务通过Fegin组件+服务名调用服务 报错时,注册中心的情况: Applicat ...