luogu P2617 Dynamic Rankings && bzoj 1901 (带修改区间第k大)
链接:https://www.luogu.org/problemnew/show/P2617
思路:
如果直接在主席树上修改的话,每次修改都会对后面所有的树造成影响,一次修改的复杂度就会变成 : n*logn,我们套上树状数组维护,每次就最多只用更新logn棵树,复杂度是:logn*logn,是可以接受的;
代码参考hzwer: http://hzwer.com/2835.html
实现代码;
#include<bits/stdc++.h>
using namespace std;
const int M = 2e5+;
int v[M],num[M*],has[M*];
int op[M],A[M],B[M],K[M],rt[M];
int sum[M*],ls[M*],rs[M*];
int L[],R[],a,b,tot,idx,k; int lowbit(int x){
return x&(-x);
} int find(int x){
int l = ,r = tot;
while(l <= r){
int mid = (l + r) >> ;
if(has[mid] < x) l = mid + ;
else r = mid - ;
}
return l;
} void update(int old,int &k,int p,int c,int l,int r){
k = ++idx;
ls[k] = ls[old],rs[k] = rs[old];
sum[k] = sum[old] + c;
if(l == r) return ;
int mid = (l + r) >> ;
if(p <= mid) update(ls[old],ls[k],p,c,l,mid);
else update(rs[old],rs[k],p,c,mid+,r);
} int query(int l,int r,int k){
if(l == r) return l;
int suml = ,sumr = ;
for(int i = ;i <= a;i ++) suml += sum[ls[L[i]]];
for(int i = ;i <= b;i ++) sumr += sum[ls[R[i]]];
int mid = (l + r) >> ;
if(sumr - suml >= k){
for(int i = ;i <= a;i ++) L[i] = ls[L[i]];
for(int i = ;i <= b;i ++) R[i] = ls[R[i]];
return query(l,mid,k);
}
else {
for(int i = ;i <= a;i ++) L[i] = rs[L[i]];
for(int i = ;i <= b;i ++) R[i] = rs[R[i]];
return query(mid+,r,k-(sumr-suml));
}
} int main()
{
int n,m,cnt = ;
scanf("%d%d",&n,&m);
for(int i = ;i <= n;i ++){
scanf("%d",&v[i]);
num[++cnt] = v[i];
}
char s[];
for(int i = ;i <= m;i ++){
scanf("%s",s);
scanf("%d%d",&A[i],&B[i]);
if(s[]=='Q') scanf("%d",&K[i]),op[i] = ;
else num[++cnt] = B[i];
}
sort(num+,num+cnt+);
has[++tot] = num[];
for(int i = ;i <= cnt;i ++){
if(num[i] != num[i-])
has[++tot] = num[i];
}
for(int i = ;i <= n;i ++){
int k = find(v[i]);
for(int j = i;j <= n;j += lowbit(j))
update(rt[j],rt[j],k,,,tot);
}
for(int i = ;i <= m;i ++){
if(op[i]){
a = ; b = ; A[i]--;
for(int j = A[i];j > ;j -= lowbit(j))
L[++a] = rt[j];
for(int j = B[i];j > ;j -= lowbit(j))
R[++b] = rt[j];
printf("%d\n",has[query(,tot,K[i])]);
}
else{
int k = find(v[A[i]]);
for(int j = A[i];j <= n;j += lowbit(j))
update(rt[j],rt[j],k,-,,tot);
v[A[i]] = B[i];
k = find(B[i]);
for(int j = A[i];j <= n;j += lowbit(j))
update(rt[j],rt[j],k,,,tot);
}
}
return ;
}
luogu P2617 Dynamic Rankings && bzoj 1901 (带修改区间第k大)的更多相关文章
- 洛谷P2617 Dynamic Rankings 主席树 单点修改 区间查询第 K 大
我们将线段树套在树状数组上,查询前预处理出所有要一起移动的节点编号,并在查询过程中一起将这些节点移到左右子树上. Code: #include<cstdio> #include<cs ...
- 【ZOJ2112】【整体二分+树状数组】带修改区间第k大
The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...
- Dynamic Rankings——带修改区间第k大
三种做法:1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树状 ...
- luogu P2617 Dynamic Rankings(分块,n <= 1e4)
嘟嘟嘟 带修改区间第k大. 然而某谷把数据扩大到了1e5,所以用分块现在只能得50分. 分块怎么做呢?很暴力的. 基本思想还是块内有序,块外暴力统计. 对于修改,直接重排修改的数所在块,时间复杂度O( ...
- luogu P2617 Dynamic Rankings(主席树)
嘟嘟嘟 一句话题意:带修改区间第\(k\)小. 不修改都会,主席树板子.但是有修改就要比较深入的理解主席树了. 众所周知,主席树中以\(i\)为根的线段树维护的是\([1, i]\)这个前缀的权值,因 ...
- 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小
少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...
- [luogu P2617] Dynamic Rankings 带修主席树
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...
- Luogu P2617 Dynamic Rankings
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...
- Luogu P2617 Dynamic Rankings(整体二分)
题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...
随机推荐
- 启用WCF压缩提升Dynamics 365 CE的网络性能
摘要: 微软动态CRM专家罗勇 ,回复307或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文系根据微 ...
- ARM汇编指令集_学习笔记(1)
一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...
- Android Studio集成Flutter
首先Flutter中文网教程地址:https://flutterchina.club/get-started/install/ 1.新建环境变量 变量名:PUB_HOSTED_URL 变量值:http ...
- ubuntu中使用机密数据Secrets
目录 AptNetCore使用Secrets管理私密数据 前言 使用 设置UserSecretsId 设置机密 代码中访问机密 脚注 AptNetCore使用Secrets管理私密数据 前言 在项目中 ...
- ASP.MVC学习资源总结
自己动手写一个简单的MVC框架(第一版) 自己动手写一个简单的MVC框架(第二版) ASP.Net请求处理机制初步探索之旅 - Part 1 前奏 ASP.Net请求处理机制初步探索之旅 - Part ...
- MySQL:1366 - Incorrect string value错误解决办法
今天使用navicat向MySQL中插入中文时,报错: - Incorrect string value:... 在我自己数据库设计之初,没有设计好字符编码格式的问题. 使用如下语句解决: alter ...
- Ubuntu 16.04 启用 点击Launcher图标,窗口实现最小化 功能
安装了Ubuntu之后,要是每次都点击最小化按钮来实现窗口的最小化,操作起来很不方便,那么怎么样才能方便操作呢, Ubuntu 16.04 本身支持 点击应用程序Launcher图标实现最小化 功能, ...
- 英语口语练习系列-C12-不了解
词汇 air [eə(r)] n. 空气 fresh air 新鲜的空气 warm air 暖暖的空气 I like to air the room. 我喜欢给房间通气. on the air 正在播 ...
- top后台执行显示:top: failed tty get 错误
通过其他程序或脚本在非交互式模式下调用top命令,经常会出现: top: failed tty get 错误 解决办法:加个-b 选项皆可 -b : Batch mode operation ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...