Description:

给定一个序列,支持两种操作

1.在[L,R]的每个位置上加上一个数 (注意一个位置上有多个数

2.查询[L,R]上所有数中的第K大

Hint:

\(n,m<=5e4\)

Solution:

一道很好的整体二分题,在值域上二分所有询问的答案,并在线段树上维护\(size\)

详见代码

#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const int mxn=5e4+5;
struct Q {
int opt,l,r,x,id;
}q[mxn],tl[mxn],tr[mxn];
int n,m,tot;
ll ans[mxn],t[mxn<<2],rec[mxn<<2],tag[mxn<<2]; namespace SegmentTree {
inline void push_up(int p) {
t[p]=t[ls]+t[rs];
};
inline void push_down(int l,int r,int p) {
if(rec[p]) {
tag[ls]=tag[rs]=t[ls]=t[rs]=0;
rec[ls]=rec[rs]=1;
rec[p]=0;
}
if(tag[p]) {
int mid=(l+r)>>1;
tag[ls]+=tag[p],tag[rs]+=tag[p];
t[ls]+=(mid-l+1)*tag[p],
t[rs]+=(r-mid)*tag[p];
tag[p]=0;
}
};
void update(int l,int r,int ql,int qr,int val,int p) {
if(ql<=l&&r<=qr) {
t[p]+=(r-l+1)*val;
tag[p]+=val;
return ;
}
int mid=(l+r)>>1; push_down(l,r,p);
if(ql<=mid) update(l,mid,ql,qr,val,ls);
if(qr>mid) update(mid+1,r,ql,qr,val,rs);
push_up(p);
};
ll query(int l,int r,int ql,int qr,int p) {
if(ql<=l&&r<=qr) return t[p]; ll res=0;
int mid=(l+r)>>1; push_down(l,r,p);
if(ql<=mid) res+=query(l,mid,ql,qr,ls);
if(qr>mid) res+=query(mid+1,r,ql,qr,rs);
return res;
};
}
using namespace SegmentTree;
int ss;
void solve(int l,int r,int ql,int qr)
{
if(l==r) {
for(int i=ql;i<=qr;++i)
if(q[i].opt==2)
if(!ans[q[i].id]) ans[q[i].id]=l;
return ;
}
int mid=(l+r)>>1,fl=0,fr=0;
int L=0,R=0;rec[1]=1,tag[1]=t[1]=0; //有些变量不能开全局,切记!!!
for(int i=ql;i<=qr;++i) {
if(q[i].opt==1) {
if(q[i].x>mid) {
update(1,n,q[i].l,q[i].r,1,1);
tr[++R]=q[i];
}
else tl[++L]=q[i];
}
else {
ll tp=query(1,n,q[i].l,q[i].r,1);
if(q[i].x<=tp) tr[++R]=q[i],fr=1;
else q[i].x-=tp,tl[++L]=q[i],fl=1;
}
}
for(int i=1;i<=L;++i) q[ql+i-1]=tl[i];
for(int i=L+1;i<=L+R;++i) q[ql+i-1]=tr[i-L];
if(fl) solve(l,mid,ql,ql+L-1);
if(fr) solve(mid+1,r,ql+L,qr);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) {
scanf("%d%d%d%d",&q[i].opt,&q[i].l,&q[i].r,&q[i].x);
if(q[i].opt==2) q[i].id=++tot;
}
solve(-n,n,1,m);
for(int i=1;i<=tot;++i) printf("%lld\n",ans[i]);
return 0;
}

[ZJOI2013]K大数查询的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  3. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  4. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  5. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  6. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  7. P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)

    P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...

  8. 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询

    [BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...

  9. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  10. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

随机推荐

  1. spring cloud 使用ribbon简单处理客户端负载均衡

    假如我们的multiple服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改 ...

  2. 饮冰三年-人工智能-Python-11之HelloWorld

    1:安装不在介绍,下载软件下一步即可,配置环境变量(Python37会默认配置环境变量的) D:\Programs\Python\Python37\Scripts\;D:\Programs\Pytho ...

  3. 20165323 实验三 敏捷开发与XP实践

    一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年4月28日 实验时间:13:45 - 15:25 实验序号:实验 ...

  4. TFS: 解决The build agent error - the session for this agent already exists

    来源:http://ericphan.net/blog/2016/6/10/solving-the-tfs-build-agent-error-the-session-for-this-agent-a ...

  5. 一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务

    1:Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务 A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程序(只要有半数以上节点存活 ...

  6. Temporal Segment Networks

    摘要 解决问题 用CNN框架有效提取video长时序特征 在UCF101等训练集受限的情况下训练网络 贡献 TSN网络,基于长时间时序结构模型.稀疏时序采样策略,视频层监督有效学习整个视频. HMDB ...

  7. BZOJ 4282(慎二的随机数列

    题解: 网上题解还没看 我的方法是用平衡树维护一个单调栈 由于N用了一定是赚的 所以它的作用是让f[i+1]=f[i]+1 这个是可以记录的 就跟noip蚯蚓那题一样 然后插入一个值的时候查询前面的最 ...

  8. la 3938(未完成)

    题意:给出一个长度为n的整数序列D,你的任务是对m个询问作出回答.对于询问(a,b), 需要找到两个下标x和y,使得a≤x≤y≤b,并且Dx+Dx+1+...+Dy尽量大. 如果有多组满足条件的x和y ...

  9. Windows 之 IP地址

    IP地址是指互联网协议地址(Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络 ...

  10. 【Android】Android处理Home键方法小结

    实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用: 方法1:onSaveInstanceState方法 下面这个方法可以处理home的 ...