以下时空限制来自zoj
Time limit 10000 ms
Memory limit 32768 kB
OS Linux
Source Online Contest of Christopher's Adventure
Author XIN, Tao

吐槽

zoj卡空间卡得太死了……32MB,远远不够放没优化过的主席树套树状数组……刚开始时段错误,还以为是t数组没开够,还是学得不扎实,别人说是就是,都没自己想想算算……后来二分骗数据,发现在还没开始操作、正在建最初的主席树时空间就爆了。没有优化的主席树,t数组要开到N*100左右,但这题最多给开到N*40……所以逼着我们优化空间。

平台 n m 空间限制
洛谷 1e5 1e5 1000MB
BZOJ 1e4 1e4 128MB
ZOJ 5e4 1e4 32MB

解题思路

  1. 分块+二分查找 https://blog.csdn.net/qq_35320178/article/details/81077787
  2. 整体二分、cdq分治 https://www.cnblogs.com/ScratchingBear/p/5345820.html
  3. 线段树套平衡树、权值线段树套平衡树 https://blog.csdn.net/htt_h/article/details/47701417
  4. 树状数组套主席树 https://www.cnblogs.com/Empress/p/4659824.html
    • 这篇博客讲得是真的好,垃圾百度把它排到贼靠后

源代码

这个是我在BZOJ(本机测的darkbzoj数据,把N和M改小即可)、洛谷上的AC代码,主要参考洛谷zsy的题解。ZOJ的留坑,打算把优化空间的方法、整体二分、cdq分治学了。

// luogu-judger-enable-o2
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int N=100010,M=100010;
int T;
int n,m;
int a[N];
struct Opt{char mode;int l,r,k;
}opt[M];int val[N+M],sz;
int id(int x){return std::lower_bound(val+1,val+sz+1,x)-val;}struct Node{int lson,rson;long long sum;
}t[N*400];
int root[N],cnt=0;int inline lowbit(int x){return x&-x;}void update_tree(int &x,int l,int r,int pos,int k)
{//pre好像不需要啊,第x个节点的值并不用从pre继承过来,因为套上树状数组以后就不是前缀和了。参考zsy博客if(!x) x=cnt++;//x等于0说明还没分配过t[x].sum+=k;if(l==r) return;int mid=l+r>>1;if(pos<=mid) update_tree(t[x].lson,l,mid,pos,k);else update_tree(t[x].rson,mid+1,r,pos,k);
}
void change(int pos,int k)//数字a[pos]数量加k(先把之前的值去掉)
{int value=id(a[pos]);for(int i=pos;i<=n;i+=lowbit(i))update_tree(root[i],1,sz,value,k);
}
int temp[2][20];
//记录询问时需要统计的节点编号,因为根有root数组,可以root[x-lowbit(x)],但下来的儿子孙子节点不能,所以先把需要统计的根记录在temp数组中,然后统计完一层以后将temp数组记录的节点向下挪动。
//temp[0]记录第l-1棵线段树上的节点编号,temp[1]记录第r棵线段树上的节点编号。
//由于节点已经存到temp中了,所以que_tree函数的参数就少了很多了。
int que_tree(int l,int r,int k)
{if(l==r) return l;int mid=l+r>>1,delta=0;for(int i=1;i<=temp[1][0];i++) delta+=t[t[temp[1][i]].lson].sum;for(int i=1;i<=temp[0][0];i++) delta-=t[t[temp[0][i]].lson].sum;//统计那几棵树的左儿子的sum,用来和k比较,找出从左还是从右if(k<=delta)//向左走{for(int i=1;i<=temp[0][0];i++) temp[0][i]=t[temp[0][i]].lson;for(int i=1;i<=temp[1][0];i++) temp[1][i]=t[temp[1][i]].lson;//temp也向下走return que_tree(l,mid,k);}else{for(int i=1;i<=temp[0][0];i++) temp[0][i]=t[temp[0][i]].rson;for(int i=1;i<=temp[1][0];i++) temp[1][i]=t[temp[1][i]].rson;return que_tree(mid+1,r,k-delta);}}int que(int l,int r,int k)
{temp[0][0]=temp[1][0]=0;//用于统计temp[0]和temp[1]中存了多少个节点下标for(int i=l-1;i;i-=lowbit(i))temp[0][++temp[0][0]]=root[i];for(int i=r;i;i-=lowbit(i))temp[1][++temp[1][0]]=root[i];return que_tree(1,sz,k);
}
/******************调试代码******************/
//用于输出主席树上每棵线段树所代表的序列
int quesum(int x,int l,int r,int pos)
{if(l==pos&&pos==r) return t[x].sum;int mid=l+r>>1;if(pos<=mid) return quesum(t[x].lson,l,mid,pos);else return quesum(t[x].rson,mid+1,r,pos);
}
inline void debug()
{for (int i = 1; i <= sz; i++)printf("%d ", val[i]);puts("\n****************");for (int rt = 0; rt <= n; rt++, puts(""))for (int i = 1; i <= sz; i++)printf("%d ", quesum(root[rt], 1, sz, i));puts("******************");
}
/*******************调试代码完*****************/
int main()
{//freopen("test.in","r",stdin);//scanf("%d",&T);//while(T--){sz=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",a+i),val[++sz]=a[i];for(int i=1;i<=m;i++){char mode[2];int l,r,k;scanf("%s",mode);if(mode[0]=='Q'){scanf("%d%d%d",&l,&r,&k);opt[i]={mode[0],l,r,k};}else{scanf("%d%d",&l,&k);opt[i]={mode[0],l,0,k};val[++sz]=k;}}std::sort(val+1,val+1+sz);sz=std::unique(val+1,val+sz+1)-val-1;//memset(root,0,sizeof(root));//memset(t,0,sizeof(t));cnt=1;for(int i=1;i<=n;i++)change(i,1);//debug();for(int i=1;i<=m;i++){if(opt[i].mode=='Q'){printf("%d\n",val[que(opt[i].l,opt[i].r,opt[i].k)]);}else{change(opt[i].l,-1);a[opt[i].l] = opt[i].k;change(opt[i].l,1);//debug();}}}return 0;
}

转载于:https://www.cnblogs.com/wawcac-blog/p/11266889.html

BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings相关推荐

  1. ZOJ 2112 Dynamic Rankings

    这里是题目地址 其实就是带修改的区间第K大. 写了一下BIT套主席树,内存飞起,似乎需要特别的优化技巧 = = 所以还是写了一下线段树套平衡树,跑了1s左右. 其实线段树套平衡树就是归并树的自然扩展而 ...

  2. ZOJ 2112 Dynamic Rankings(主席树-动态第k大)

    Description 给出一个长度为n的序列a,两种操作 C x v:将第x个元素的值改成v Q l r k:查询区间[l,r]中第k大的元素 Input 第一行为一个整数t表示用例组数,每组用例第 ...

  3. #莫比乌斯反演#BZOJ 2671 洛谷 4466 和与积 Calc

    题目 求有多少对(a,b)(a,b)(a,b)满足1≤a<b≤n1\leq a<b\leq n1≤a<b≤n且a+b∣aba+b|aba+b∣ab 分析 若gcd(a,b)=1gcd ...

  4. BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły

    [题解] 手残写错调了好久QAQ...... 洛谷的数据似乎比较水.. n个正整数!!这很重要 这道题是个类似two pointer的思想,外加一个单调队列维护当前区间内长度为d的子序列中元素之和的最 ...

  5. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...

  6. 洛谷P2617 Dynamic Rankings

    带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...

  7. BZOJ 3720 [洛谷P2137] : Gty的妹子树

    Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每 ...

  8. BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡

    https://www.lydsy.com/JudgeOnline/problem.php?id=2733 https://www.luogu.org/problemnew/show/P3224 C+ ...

  9. bzoj 2653 洛谷 P2839 [国家集训队] middle

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2381  Solved: 1340 [Submit][Status][Di ...

  10. #距离#JZOJ 3256 BZOJ 3170 洛谷 3964 松鼠聚会

    题目 分析 首先这个距离是切比雪夫距离,得把它转换成曼哈顿距离,也就是把(x,y)(x,y)(x,y)变成(x+y2,x−y2)(\frac{x+y}{2},\frac{x-y}{2})(2x+y​, ...

最新文章

  1. FastDFS之Linux下搭建
  2. CVPR2020 | 真实场景中的玻璃检测,有趣的应用
  3. Android Binder设计与实现 – 设计篇
  4. Apache Pulsar中的地域复制,第1篇:概念和功能
  5. 前端Yslow的23个优化原则
  6. JZOJ__Day 5:【普及模拟】权势二进制
  7. 整合tomcat的一些配置
  8. Python解析XML文件
  9. UI学习笔记---第十四天数据持久化
  10. 如何使用SAP C4C Repository Explorer里的BO test shell
  11. 阿里推出会议AI助理“听悟”,面向未来会议
  12. 文章用图的修改和排版(2)
  13. java实现icmp攻击,利用java实现ICMP协议在linux环境配置
  14. 持续更新-Linux应用一句话
  15. LeetCode刷题——除数博弈
  16. MMP,我兄弟转正前一天,一个垃圾公司把他辞退了!
  17. ini_set和require使用
  18. 店宝宝电脑版_母婴店主干货分享:母婴店利润究竟有多大?
  19. JSP程序设计第二版--附带实验代码
  20. 干货 | 收藏贴!一文看懂静态资源服务沉浮及其在携程的演进

热门文章

  1. 开源爬虫框架各有什么优缺点?
  2. Qt-textEdit 滚顶条设置只读模式
  3. CS224n--Lecture 1 Introduction and Word Vectors
  4. Day 1: Introduction to Deep Learning
  5. 扬州大学c语言上机作业答案,扬州大学C语言上机作业1-9整理
  6. cropbox php,jQuery用户头像裁剪插件cropbox.js使用详解
  7. sqlite 检索的字段结果前加空格_MySQL5.7分词全文检索思路
  8. 会议服务器维护保养,关于视频会议系统的维护和保养方法
  9. delphi dbgrideh 遍历每一个单元格_BFS 的使用场景:层序遍历、最短路径问题
  10. 以太坊 事务处理流程