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 ...
随机推荐
- caffe--anaconda2--makefile.config--compile --ubuntu16.04
sea@sea-X550JK:/media/sea/wsWin10/wsUbuntu16.04/DlFrames/caffe$ cat Makefile.config: ## Refer to htt ...
- 使用OpenGL进行Mandelbrot集的可视化
Mandelbrot集是哪一集?? Mandelbrot集不是哪一集!! 啊不对-- Mandelbrot集是哪一集!! 好像也不对-- Mandelbrot集是数集!! 所以--他不是一集而是数集? ...
- Hadoop起源
本文来自Doug Cutting为<Hadoop权威指南>所作之序,感觉读一下还是挺有收获的. Hadoop 起源于Nutch项目.我们几个人有一段时间一直在尝试构建一个开源的Web搜索引 ...
- 已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。 从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。
// ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...
- IE浏览器的判断
function compatibleIE8(){ var browser = navigator.appName; var b_version = navigator.appVersion; if( ...
- IIS的ARR实现站点的负载均衡 nginx 对比
windows下使用IIS的ARR实现站点的负载均衡 - CSDN博客 https://blog.csdn.net/zzy7075/article/details/73294713 IIS的ARR实现 ...
- Hadoop实战-Flume之自定义Source(十八)
import java.nio.charset.Charset; import java.util.HashMap; import java.util.Random; import org.apach ...
- 【Linux】服务器之间的免密登录脚本
在实际运维的过程中,经常需要用到免密登录,下面这个脚本实现服务器之间的免密登录,如下 比如,要实现A服务器与B.C.D服务器的免密登录,只需要将B.C.D服务器的IP地址写在serverlist.tx ...
- maven 手动安装本地jar包
1.需要知道groupId.artifactId.version通过 cmd命令行执行 mvn install:install-file ,比如安装sigar.jar如下: mvn install:i ...
- Android 普通okhttp、okhttp utils执行 post get请求,文件上传下载、请求图片
public class OKHttpActivity extends Activity implements View.OnClickListener { public static final M ...