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

转载于:https://www.cnblogs.com/list1/p/10363263.html

[ZJOI2013]K大数查询相关推荐

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

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

  2. BZOJ3110: [Zjoi2013]K大数查询

    BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...

  3. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  4. bzoj3110 [Zjoi2013]K大数查询

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

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

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

  6. [BZOJ3110] [Zjoi2013]K大数查询

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

  7. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  8. bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  9. BZOJ3110: [Zjoi2013]K大数查询(整体二分)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

最新文章

  1. 树莓派如何卸载mysql_树莓派安装MySQL数据库与卸载
  2. LeCun之后Jeff Dean离奇躺枪,哥大黑人女博士:你们得引用我!
  3. 计算机科学的理论基础
  4. 题解-ZeroJudge-c686 高斯符號
  5. 【资源下载】清华姚班、普林斯顿博士、斯坦福大学助理教授马腾宇博士论文下载——2018ACM最佳博士论文提名
  6. 关于Js下拉导航的解释
  7. 多路径配置udev_多路径multipath配置,udev绑定
  8. oracle双机热备份方法(转)
  9. JavaScript 教程+代码(下)
  10. c语言报告实验反思,c语言实验总结与反思
  11. 邓俊辉 数据结构 第二章 向量 笔记
  12. ssm根据pdf模板导出pdf
  13. C# winform 自定义控件配置代码 多显示 换行
  14. 基于影像基因的肺结节分割、肺癌分类分期、CT影像预测基因突变 --董云云 论文阅读
  15. 视频搬运专业版-为搬运而生
  16. np.array数组的切片
  17. 看最强大脑的数字华容道,尝试理解与总结
  18. 刹那芳华,犹如指尖流砂
  19. 记第一次爬虫 python3.6+pyquery
  20. Chart.js 中文文档(整理)

热门文章

  1. 你是多大年龄感觉自己开窍了,明白许多人世间的道理?
  2. 投资一个五星级酒店需要多钱?多长时间能回本?
  3. 好的营销,往往叫广深高速
  4. 想赚钱是好事,但盲目创业就容易悲剧
  5. 人不能轻易暴露自己的底牌,否则会陷入被动的局面
  6. 迷茫时,按照这7个方法寻找方向
  7. SQL 中为什么经常要加NOLOCK?
  8. Qt——P23 登录窗口布局
  9. 派生类对基类成员的访问控制之公有继承
  10. MySql的用户管理权限