[ZJOI2013]K大数查询
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大数查询的更多相关文章
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- 树套树专题——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大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)
P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树 把插入的值离散化一下开个线段树 蓝后每个节点开个线段树,维护一下每个数出现的区间和次数 为了防止MLE动态开点就好辣 重点是标记永久 ...
- 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询
[BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...
- 3110: [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
随机推荐
- ConfigurationManager 类的使用
一.引用 命名空间: System.Configuration程序集: System.Configuration(位于 System.Configuration.dll) 二.示例 1.读取.增 ...
- webstorm ps
2018WebStorm注册码 2018-10-10 2018年08月22日 17:36:58 阳光明媚的味道 阅读数:6325 8月21日 http://webstorm.autoseasy ...
- 【转】Android逆向入门流程
原文:https://www.jianshu.com/p/71fb7ccc05ff 0.写在前面 本文是笔者自学笔记,以破解某目标apk的方式进行学习,中间辅以原理性知识,方便面试需求. 参考文章的原 ...
- XML与HTML的主要差异
1. 参考 XML 简介 2. XML 与 HTML 的主要差异 XML 不是 HTML 的替代. XML 和 HTML 为不同的目的而设计: XML 被设计为传输和存储数据,其焦点是数据的内容. H ...
- Centos7防火墙常用命令及mask锁定不能添加端口问题
一.开放端口 sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent sudo firewall-cmd --reload 二. ...
- VMware安装操作系统提示 " Intel VT-x 处于禁用状态"解决方法
VMWARE WORKSTATION 在安装64为操作系统(kali)报错,报错内容为:“已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT- ...
- BZOJ1823 [JSOI2010]满汉全席 2-sat
原文链接http://www.cnblogs.com/zhouzhendong/p/8125944.html 题目传送门 - BZOJ1823 题意概括 有n道菜,分别可以做成满式和汉式(每道菜只能做 ...
- netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~
还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01 . netty02 .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...
- 如何用 Python 模糊搜索文件
一.我的文件在哪里? 1.告诉计算机文件在哪 使用路径描述位置 绝对路径——从根目录写到底 内置模块OS 路径 目录 文件 其他系统操作 2.描述文件的特征 用条件判断来筛选 3.对比后打印文件名 用 ...
- 005 使用SpringMVC开发restful API三--处理创建请求
一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@Reques ...