BZOJ3110:[ZJOI2013]K大数查询
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3110
外层一个权值线段树,内层一个位置线段树。对于外层权值线段树上的结点\(p\),它所属的内层线段树上记录每个点上有多少个值在外层的\(l,r\)内。
对于加数,直接把外层线段树权值区间包涵要加的权值的所有点所属的内层线段树的区间\(l,r\)加一。
对于查询,直接在外层线段树上二分查询即可。
时间复杂度:\(O(nlog^2n)\)
空间复杂度:\(O(nlog^2n)\)
代码如下:
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=5e4+5,maxsz=1.28e7;
int n,m;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct pos_segment_tree {
int tot;
ll sum[maxsz];
int ls[maxsz],rs[maxsz],tag[maxsz];
void add(int &p,int l,int r,int L,int R) {
if(!p)p=++tot;sum[p]+=R-L+1;
if(L<=l&&r<=R) {tag[p]++;return;}
int mid=(l+r)>>1;
if(R<=mid)add(ls[p],l,mid,L,R);
else if(L>mid)add(rs[p],mid+1,r,L,R);
else add(ls[p],l,mid,L,mid),add(rs[p],mid+1,r,mid+1,R);
}
ll query(int p,int l,int r,int L,int R) {
if(L<=l&&r<=R)return sum[p];
int mid=(l+r)>>1;ll res=1ll*tag[p]*(R-L+1);
if(R<=mid)res+=query(ls[p],l,mid,L,R);
else if(L>mid)res+=query(rs[p],mid+1,r,L,R);
else res+=query(ls[p],l,mid,L,mid)+query(rs[p],mid+1,r,mid+1,R);
return res;
}
}T_inside;//标记永久化是为了卡常
struct val_segment_tree {
int rt[maxn<<2];
void change(int p,int l,int r,int pos,int L,int R) {
while(1) {
T_inside.add(rt[p],1,n,L,R);
if(l==r)break;int mid=(l+r)>>1;
if(pos<=mid)p<<=1,r=mid;
else p=p<<1|1,l=mid+1;
}
}
int query(int p,int l,int r,int L,int R,int rk) {
while(l!=r) {
int mid=(l+r)>>1;
ll tmp=T_inside.query(rt[p<<1|1],1,n,L,R);
if(tmp>=rk)p=p<<1|1,l=mid+1;
else p=p<<1,r=mid,rk-=tmp;
}
return l;
}
}T_out;//之所以这样写是为了卡常
int main() {
n=read(),m=read();
for(int i=1;i<=m;i++) {
int opt=read(),l=read(),r=read(),k=read();
if(opt==1)T_out.change(1,1,n,k,l,r);
else printf("%d\n",T_out.query(1,1,n,l,r,k));
}
return 0;
}
BZOJ3110:[ZJOI2013]K大数查询的更多相关文章
- BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)
3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...
- BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...
- BZOJ3110: [Zjoi2013]K大数查询
喜闻乐见的简单树套树= =第一维按权值建树状数组,第二维按下标建动态开点线段树,修改相当于第二维区间加,查询在树状数组上二分,比一般的线段树还短= =可惜并不能跑过整体二分= =另外bzoj上的数据有 ...
- [BZOJ3110][ZJOI2013]K大数查询(整体二分)
BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...
- BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- bzoj3110 [Zjoi2013]K大数查询——线段树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 外层权值线段树套内层区间线段树: 之所以外层权值内层区间,是因为区间线段树需要标记下传 ...
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【树套树】bzoj3110 [Zjoi2013]K大数查询
题解很多,实现起来以外地简洁.内层的区间线段树上用了标记永久化. #include<cstdio> using namespace std; #define N 50001 struct ...
随机推荐
- Linux下服务端口被占用
有一次,在启动ejabberd的时候,报错如下: 10:30:15 =CRASH REPORT==== crasher: initial call: supervisor:ejabberd_liste ...
- 如何编译文件(gcc + nasm)
[0]README 编译文件(nasm + gcc),特别是编译目标文件的依赖文件:本文旨在回顾 gcc 和 nams 编译器的编译命令,以及如果有多个依赖文件该如何编译: [1]编译文件 1.1)编 ...
- EF6&EFCore 注册/使用实体类的正确姿势
首先回顾下EF中常规使用流程 1.新建实体类以及实体配置(data annotation或fluent api) [Table("Users")] public class Use ...
- MongoDB安装配置(Windows)
官网下载:https://www.mongodb.com/ 百度经验:https://jingyan.baidu.com/article/d5c4b52bef7268da560dc5f8.html 官 ...
- ios中实现对UItextField,UITextView等输入框的字数限制
本文转载至 http://blog.sina.com.cn/s/blog_9bf272cf01013lsd.html 2011-10-05 16:48 533人阅读 评论(0) 收藏 举报 1. ...
- 基于live555实现的RTSPServer对底层进行性能优化的方法
在博客<EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案>我介绍了基于live555实现的一套RTSPServer功能组件,当时开发者经过几个月的调试,已经将 ...
- Mybatis的配置文件和映射文件详解
一.Mybatis的全局配置文件 1.SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAlias ...
- The goroutine scheduler is not preemptive.
go - Why is time.sleep required to run certain goroutines? - Stack Overflow https://stackoverflow.co ...
- mybatis 各组件生命周期
1.SqlSessionFactoryBuilder SqlSessionFactoryBuilder是通过利用XML或者java编码来获取Configuration配置来构建SqlSessionFa ...
- JVM--内存区的划分
转自:http://www.jianshu.com/p/7ebbe102c1ae Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域. java虚拟机运行时数据区 一. ...