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,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...
随机推荐
- 为你揭秘知乎是如何搞AI的——窥大厂 | 数智方法论第1期
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 数智物语(公众号ID:decision_engine)出品 策划.编写:卷毛雅各布 「我们相信,在垃圾 ...
- word表格转html后去除冗余代码
word可以另存为html文件,通过这个功能,可以快速实现网页展示word内容,特别是表格的编辑,它包含tr.td.th.rowspan.colspan等内容,直接写比较繁琐. 但word转换过来的h ...
- ListView展示不同布局需要注意的地方
尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8419010.html 我们在项目中经常需在一个listview中展示不一样的布局,我们可以在adapt ...
- Android--解决图片保存到相册显示1970年1月1日 8:00的问题
import android.content.Context; import android.content.Intent; import android.database.Cursor; impor ...
- MongoDB 常用的数据备份梳理汇总
1.基于数据文件的备份 直接将原始的数据文件Copy至备份的地方,这个方法的优点是比较快,因为备份和恢复都不需要转换数据格式.缺点就是需要锁住数据库服务器,但是此方案通常备份是在从节点上进行,备份过程 ...
- c/c++ 重载运算符 标准库function的用法
重载运算符 标准库function的用法 问题:int(int, int)算不算一种比较通用的类型?? 比如函数: int add(int a, int b); 比如lambda:auto mod = ...
- LeetCode算法题-Detect Capital(Java实现)
这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...
- java图片上传及图片回显1
目的:选择图片,进行图片回显之后将图片保存到服务器上(PS:没有使用任何插件,样式很丑) 实现方式: js+servlet+jsp的方式来实现 事先准备: 文件上传处理在浏览器中是以流的形式提交到服务 ...
- 面向对象_classmethod_staticmethod
classmethod:类方法 主要用于改变静态属性 class Fruit_price: __discount= 1 def __init__(self,original_price): self. ...
- centos7配置静态ip地址
1.配置文件所在目录为 /etc/sysconfig/network-scripts cd /etc/sysconfig/network-scripts 2.打开配置文件进行修改,建议在修改之前先备份 ...