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 数学成绩优异 ...
随机推荐
- Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”) 目的: 当时在安装Qt时,有些组件暂时没用着,然后过一段时间后,需要用到某些该组件时,不用删掉重新再安装. 操作: Wind ...
- Stack Overflow是如何做应用缓存的
首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...
- 升级win10 1903版后,vmware打开虚拟机黑屏的解决办法
按照网上给的方法(1-3),又增加了几步(从4开始,只在我自己电脑上实践过): 1. 打开cmd,执行以下命令 netsh winsock reset 2. 重启电脑 3. 以管理员身份执行vmwar ...
- 定时任务cron表达式详解
参考自:https://blog.csdn.net/fanrenxiang/article/details/80361582 一 cron表达式 顺序 秒 分 时 日期 月份 星期 年(可选) 取值 ...
- Http 和 Socket 之间的恩爱情仇
前言 一些刚入门的小伙伴可能会用 Socket,也会用 OkHttp 或者 HttpUrlConnection 等一些 HTTP 客户端工具,这两个东西看着有点像可是又不太一样,到底是哪里不一样呢? ...
- 通过DB13备份SystemDB
配置systemdb capital user name:SYSTEM save -back Save 现在可以通过DB13备份SystemDB Done. Congratulations!
- Django之过滤器
Django 过滤器 过滤器 描述 示例 upper 以大写方式输出 {{ user.name | upper }} add 给value加上一个数值 {{ user.age | add:”5” ...
- Python标准库3.4.3-webbrowser-21.1
21.1. webbrowser — Convenient Web-browser controller Source code: Lib/webbrowser.py 翻译:Z.F. The web ...
- CISCO设备配置SSH 登陆
1. 设置设备域名CISCO ip domain name CISCO2.创建密钥Server(config)#crypto key generate rsa The name for the key ...
- 如何使用Jmeter批量构造MySQL测试数据
前言: 当我们进行API测试.Web Service或者其他系统模块测试时,你可能需要从数据库获取并记录数据.这些测试的目的是检查数据库中指定的数据,或者向数据库添加指定的数据,这篇文章会展示使用JM ...