博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1901 主席树+树状数组
阅读量:6731 次
发布时间:2019-06-25

本文共 2719 字,大约阅读时间需要 9 分钟。

修改+查询第k小值

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

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

#include
#include
#include
#include
#include
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;}

转载于:https://www.cnblogs.com/Ren-Ivan/p/7746723.html

你可能感兴趣的文章
5天玩转C#并行和多线程编程 —— 第四天 Task进阶
查看>>
《你的灯亮着吗》——读后总结
查看>>
LoadRunner FAQ2
查看>>
Sql Server之旅——第五站 确实不得不说的DBCC命令
查看>>
用适配器模式处理复杂的UITableView中cell的业务逻辑
查看>>
HOG特征-理解篇
查看>>
结构类模式(四):装饰(Decorator)
查看>>
java面试题
查看>>
使用两个 Windows 窗体 DataGridView 控件创建一个主/从窗体
查看>>
111、Android 高仿 频道管理---(可以拖动的GridView)附源码DEMO (转载)
查看>>
l2正则化
查看>>
Atitit 视图状态ViewState)的原理与管理
查看>>
067 Flume协作框架
查看>>
java的(PO,VO,TO,BO,DAO,POJO)解释
查看>>
Windows Server 2012 NIC Teaming 网卡绑定介绍及注意事项
查看>>
Session中放错误提示JSP上获取
查看>>
关于.NET异常处理的思考
查看>>
使用 Git Hooks 实现自动项目部署
查看>>
宏内核与微内核【转】
查看>>
笔记︱集成学习Ensemble Learning与树模型、Bagging 和 Boosting
查看>>