BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 6050 Solved: 2007
[Submit][Status][Discuss]
Description
有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
Input
第一行N,M
接下来M行,每行形如1 a b c或2 a b c
Output
输出每个询问的结果
Sample Input
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
Sample Output
2
1
HINT
【样例说明】
第一个操作 后位置 1 的数只有 1 , 位置 2 的数也只有 1 。 第二个操作 后位置 1
的数有 1 、 2 ,位置 2 的数也有 1 、 2 。 第三次询问 位置 1 到位置 1 第 2 大的数 是
1 。 第四次询问 位置 1 到位置 1 第 1 大的数是 2 。 第五次询问 位置 1 到位置 2 第 3
大的数是 1 。
N,M<=50000,N,M<=50000
a<=b<=N
1操作中abs(c)<=N
2操作中c<=Maxlongint
本题做法好多啊,人太弱先写权值线段树套区间线段树吧
蒟蒻无脑总结:树套树是一种二维数据结构,用来解决二维的信息修改和询问
本题两个信息,一段区间中保存数,求第k大
显然用一个区间数据结构一个可求排名的数据结构,可以用权值线段树和区间线段树
区间线段树在外层,维护增加数的信息好难啊
权值线段树在外层,每个节点放一颗区间线段树维护这个节点权值在区间中出现次数
修改...修改就行了啊
查询,在权值线段树上二分答案,只不过用的是[a,b]中的出现次数
复杂度nlog^2n
参考别人写的,好诡异啊,明明有范围那么大还有负数,不离散化也能A
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- #define m ((l+r)>>1)
- #define lc t[o].l
- #define rc t[o].r
- #define lson t[o].l,l,m
- #define rson t[o].r,m+1,r
- const int N=5e4+;
- typedef long long ll;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-; c=getchar();}
- while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
- return x*f;
- }
- int n,Q,op,ql,qr,v;
- struct node{
- int l,r;
- ll sum,tag;
- }t[N*];
- int sz;
- inline void merge(int o){
- t[o].sum=t[lc].sum+t[rc].sum;
- }
- inline void paint(int &o,int l,int r,ll d){
- if(!o) o=++sz;
- t[o].sum+=(ll)(r-l+)*d;
- t[o].tag+=d;
- }
- inline void pushDown(int o,int l,int r){
- if(t[o].tag){
- paint(lson,t[o].tag);
- paint(rson,t[o].tag);
- t[o].tag=;
- }
- }
- void add(int &o,int l,int r,int ql,int qr,int d){
- if(!o) o=++sz;
- if(ql<=l&&r<=qr) paint(o,l,r,d);
- else{
- pushDown(o,l,r);
- if(ql<=m) add(lson,ql,qr,d);
- if(m<qr) add(rson,ql,qr,d);
- merge(o);
- }
- }
- ll query(int o,int l,int r,int ql,int qr){
- if(!o) return ;
- if(ql<=l&&r<=qr) return t[o].sum;
- else{
- pushDown(o,l,r);
- ll ans=;
- if(ql<=m) ans+=query(lson,ql,qr);
- if(m<qr) ans+=query(rson,ql,qr);
- return ans;
- }
- }
- int rt[N<<];
- void add2(int o,int l,int r,int ql,int qr,int v){
- add(rt[o],,n,ql,qr,);
- if(l==r) return;
- if(v<=m) add2(o<<,l,m,ql,qr,v);
- else add2(o<<|,m+,r,ql,qr,v);
- }
- ll query2(int o,int l,int r,int ql,int qr,int k){
- if(l==r) return l;
- ll rsize=query(rt[o<<|],,n,ql,qr);
- if(rsize>=k) return query2(o<<|,m+,r,ql,qr,k);
- else return query2(o<<,l,m,ql,qr,k-rsize);
- }
- int main(){
- //freopen("in.txt","r",stdin);
- n=read();Q=read();
- while(Q--){
- op=read();ql=read();qr=read();v=read();
- if(op==) add2(,,n,ql,qr,v);
- else printf("%lld\n",query2(,,n,ql,qr,v));
- }
- }
BZOJ 3110: [Zjoi2013]K大数查询 [树套树]的更多相关文章
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )
BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
- bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】
树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——树套树
[题目分析] 外层区间线段树,内层是动态开点的权值线段树. SY神犇说树套树注重的是内外层的数据结构的选择问题,果然很重要啊. 动态开点的实现方法很好. [代码] #include <cstdi ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
随机推荐
- Asp.net Boilerplate之AbpSession扩展
当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...
- 用dubbo时遇到的一个序列化的坑
首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...
- Dreamweaver 扩展开发:C-level extensibility and the JavaScript interpreter
The C code in your library must interact with the Dreamweaver JavaScript interpreter at the followin ...
- 转:serialVersionUID作用
汗,以前学了还忘了... Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本 ...
- CSS知识总结(九)
CSS常用样式 10.自定义动画 1)关键帧(keyframes) 被称为关键帧,其类似于Flash中的关键帧. 在CSS3中其主要以“@keyframes”开头,后面紧跟着是动画名称加上一对花括号“ ...
- VB.NET设置控件和窗体的显示级别
前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...
- javaScript生成二维码(支持中文,生成logo)
资料搜索 选择star最多的两个 第一个就是用的比较多的jquery.qrcode.js(但不支持中文,不能带logo)啦,第二个支持ie6+,支持中文,根据第二个源代码,使得,jquery.qrco ...
- 微信小程序监控 - HotApp统计
HotApp小程序统计,第一个专业的微信第三方小程序监控统计工具 1.什么是HotApp小程序统计 HotApp小程序统计是第一个微信第三方小程序统计工具,就像做android 和 ios开发的人知道 ...
- firebug不能加载JS文件 ,无法进行JS脚本调试
提示: 本页面不包含 Javascript 如果 <script> 标签有 "type" 属性,其值应为 "text/javascript" 或者& ...
- 怎样在Dos里切换盘符
一:在Dos里切换盘符 a:在电脑左下角右击显示图片;(我用的是win10系统,其他系统类似) b:点击运行,输入cmd; c:点击确定: d:输入盘符:(如f:) 或F: 只写字母,不写分号是不行的 ...