修改+查询第k小值

单纯主席树修改会打乱所有,所以再套一个树状数组维护前缀和使得修改,查询都是log

对了,bzoj上不需要读入组数,蜜汁re。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,sz,T,num_tot,num_cnt,num_l,num_r;
int sum[8000005],lon[8000005],ron[8000005],num[60005];
int a[50005],k[10005],p[10005],q[10005],root[60005];
bool bo[10005];
int L[500],R[500];
int lowbit(int x){return x&(-x);}
void update(int p,int &rt,int l,int r,int x,int y){
rt=++sz; sum[rt]=sum[p]+y;
lon[rt]=lon[p]; ron[rt]=ron[p];
if(l==r) return;
int mid=(l+r)/2;
if(x<=mid) update(lon[p],lon[rt],l,mid,x,y);
else update(ron[p],ron[rt],mid+1,r,x,y);
}
int query(int l,int r,int k){
if(l==r) return l;
int suml=0,sumr=0;
for(int i=1;i<=num_l;i++) suml+=sum[lon[L[i]]];
for(int i=1;i<=num_r;i++) sumr+=sum[lon[R[i]]];
int mid=(l+r)/2;
if(sumr-suml>=k){
for(int i=1;i<=num_l;i++) L[i]=lon[L[i]];
for(int i=1;i<=num_r;i++) R[i]=lon[R[i]];
return query(l,mid,k);
}
else{
for(int i=1;i<=num_l;i++) L[i]=ron[L[i]];
for(int i=1;i<=num_r;i++) R[i]=ron[R[i]];
return query(mid+1,r,k-(sumr-suml));
}
}
int main()
{
char s[5];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
num[i]=a[i];
} num_tot=n;
for(int i=1;i<=m;i++){
scanf("%s",s);
if(s[0]=='Q')
scanf("%d%d%d",&p[i],&q[i],&k[i]);
else{
scanf("%d%d",&p[i],&q[i]);
num[++num_tot]=q[i]; bo[i]=1;
}
}
sort(num+1,num+num_tot+1);
int num_cnt=unique(num+1,num+num_tot+1)-num-1;
for(int i=1;i<=n;i++){
int t=lower_bound(num+1,num+num_cnt+1,a[i])-num;
for(int j=i;j<=n;j+=lowbit(j))
update(root[j],root[j],1,num_cnt,t,1);
}
for(int i=1;i<=m;i++){
if(bo[i]){
int t=lower_bound(num+1,num+num_cnt+1,a[p[i]])-num;
for(int j=p[i];j<=n;j+=lowbit(j))
update(root[j],root[j],1,num_cnt,t,-1);
a[p[i]]=q[i];
t=lower_bound(num+1,num+num_cnt+1,q[i])-num;
for(int j=p[i];j<=n;j+=lowbit(j))
update(root[j],root[j],1,num_cnt,t,1);
}
else{
p[i]--; num_l=num_r=0;
for(int j=p[i];j>0;j-=lowbit(j))
L[++num_l]=root[j];
for(int j=q[i];j>0;j-=lowbit(j))
R[++num_r]=root[j];
printf("%d\n",num[query(1,num_cnt,k[i])]);
}
}
return 0;
}

bzoj 1901 主席树+树状数组的更多相关文章

  1. BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))

    题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...

  2. BZOJ 1901 Dynamic Rankings 树董事长

    标题效果:间隔可以改变k少 我的两个天树牌主席... 隔断Count On A Tree 之后我一直认为,随着树的主席的变化是分域林木覆盖率可持久段树. .. 事实上,我是误导... 尼可持久化线段树 ...

  3. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  4. CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)

    The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...

  5. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  6. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

  7. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  8. bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  9. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

随机推荐

  1. JasperReport的安装

    下载网址http://community.jaspersoft.com/community-download

  2. JavaScript脚本放在哪里用户体验好

    javascript代码写在<head>里面: 由于这时候网页主体(body)还未加载,所以这里适合放一些不是立即执行的自定义函数,立即执行的语句则很可能会出错(视浏览器而定) javas ...

  3. Eclipse如何提高开发效率

    Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查) Ctrl+Shift+F4 关闭所有打开的Editer Ctrl+Shift+X 把当前选中的文本全部变为小写 Ctrl+Sh ...

  4. Pod install 之后 no such module

    官方文档在pod install之后的操作是: open App.xcworkspace 使用pod以后,项目的旧打开方式就不行了,必须到项目目录里面,打开“项目名.xcworkspace”这种方式来 ...

  5. 对于程序员在boss直聘求职的建议

    最近为一个岗位的招聘,在直聘伤刷了三百份简历 0.上传简历最好是PDF,word简历在不同的系统和软件下排版可能会出问题. 1.新职位投得要快,后面投的,有可能看不到. 为了投的命中率,投之前最好看一 ...

  6. .net core使用orm操作mysql数据库

    Mysql数据库由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库.MySQL是一个多用户.多线程的关系型数据库管理系 ...

  7. php获取汉字首字母实例

    在我们实际开发工作中,有时候需要获取输入汉字的首字母,然后存到库中,方便用户搜索相关信息,下面给出php代码,留做备用: //新添加获取汉子首字,首字字母 function pinyin($zh){ ...

  8. CSS中的背景、雪碧图、超链接的伪类样式

    一.背景 1.背景颜色 background-color: red; 2.背景图片 background-image: url("../../img/l1.png"); 3.图片填 ...

  9. 关于dropout的有趣的进化论解释

    训练神经网络时,使用dropout技术来防止网络的过拟合.我们这里且不谈这个技术的细节,但就这项技术的有趣的生物进化论解释了解下.自然界的高等生物进化出了两性繁殖,其原因可以解释为使得变异的基因能散播 ...

  10. [CVPR2017] Deep Self-Taught Learning for Weakly Supervised Object Localization 论文笔记

    http://openaccess.thecvf.com/content_cvpr_2017/papers/Jie_Deep_Self-Taught_Learning_CVPR_2017_paper. ...