原题传送门

题意简析

给定一个区间,可以在这个区间上每个整数点插入若干个数(这些数数值可以重复)你需要支持2种操作:

1)在[a,b]间所有整数点插入c

2)查询[a,b]内第c大的数

解题思路

树套树裸题,外层是权值线段树,内层是普通线段树,通过将操作1的c离散后维护即可。

总复杂度均为\(O(n\log_{2}^{2}n)\).

#include <stdio.h>
#include <algorithm>
#define Uint unsigned int
#define MN 50005
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),TT==S)?EOF:*S++)
char BB[1<<15],*S=BB,*TT=BB;
inline int in(){
int x=0; bool f=0; char c;
for (;(c=getchar())<'0'||c>'9';f=c=='-');
for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}int n,q,op[MN],a[MN],b[MN],c[MN],v[MN],rk[MN],cnt,A,B,V;
#define mid (l+r>>1)
struct node{
node *ls,*rs;Uint sum,mark;
node(){ls=rs=NULL;sum=mark=0;}
inline void ad(Uint l,Uint x){sum+=x*l;mark+=x;}
inline void pushdown(int l,int r){
if (!mark||l==r) return;
if (!ls) ls=new node();if (!rs) rs=new node();
ls->ad(mid-l+1,mark);rs->ad(r-mid,mark);mark=0;
}
inline void pushup(){sum=(ls?ls->sum:0)+(rs?rs->sum:0);}
};
void update(int l,int r,int ad,node *&x){
if (l>B||r<A) return;if (x==NULL) x=new node();
if (A<=l&&r<=B){x->ad(r-l+1,ad);return;}
x->pushdown(l,r);update(l,mid,ad,x->ls);
update(mid+1,r,ad,x->rs);x->pushup();
}
Uint query(int l,int r,node *&x){
if (x==NULL||l>B||r<A) return 0;
if (l>=A&&r<=B) return x->sum;x->pushdown(l,r);
return query(l,mid,x->ls)+query(mid+1,r,x->rs);
}
struct node2D{
node2D *ls,*rs;node *val;
node2D(){ls=rs=NULL;val=NULL;}
}*root;
#define midd (L+R>>1)
void U(int L,int R,node2D *&x){
if (x==NULL) x=new node2D();
if (L!=R){
if (V<=midd) U(L,midd,x->ls);
else U(midd+1,R,x->rs);
}update(1,n,1,x->val);
}
Uint Q(int L,int R,node2D *x){
if (x==NULL) return 0;if (L==R)return L;
register Uint tmp=x->rs?query(1,n,x->rs->val):0;
if (tmp>=V) return Q(midd+1,R,x->rs);
else return V-=tmp,Q(L,midd,x->ls);
}
inline bool cmp(int a,int b){return c[a]<c[b];}
void init(){
n=in(),q=in();for (int i=1; i<=q; ++i)
op[i]=in(),a[i]=in(),b[i]=in(),c[i]=in(),(op[i]==1)?v[++cnt]=i:0;
std::sort(v+1,v+cnt+1,cmp);for (register int i=1; i<=cnt; ++i) rk[v[i]]=i;
}
void solve(){
for (register int i=1; i<=q; ++i){
if (op[i]==1) A=a[i],B=b[i],V=rk[i],U(1,cnt,root);
else A=a[i],B=b[i],V=c[i],printf("%d\n",c[v[Q(1,cnt,root)]]);
}
}int main(){init();solve();}

【BZOJ3110】【ZJOI2013】k大数查询的更多相关文章

  1. BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)

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

  2. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

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

    喜闻乐见的简单树套树= =第一维按权值建树状数组,第二维按下标建动态开点线段树,修改相当于第二维区间加,查询在树状数组上二分,比一般的线段树还短= =可惜并不能跑过整体二分= =另外bzoj上的数据有 ...

  4. [BZOJ3110][ZJOI2013]K大数查询(整体二分)

    BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...

  5. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

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

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

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

  7. bzoj3110 [Zjoi2013]K大数查询——线段树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 外层权值线段树套内层区间线段树: 之所以外层权值内层区间,是因为区间线段树需要标记下传 ...

  8. bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】

    模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...

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

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

  10. 【树套树】bzoj3110 [Zjoi2013]K大数查询

    题解很多,实现起来以外地简洁.内层的区间线段树上用了标记永久化. #include<cstdio> using namespace std; #define N 50001 struct ...

随机推荐

  1. 团队第1次作业:Our Team TAH

     Team named TAH    不管一个人多么有才能,但是集体常常比他更聪明和更有力. --奥斯特洛夫斯基     *introduce team and teamate 先说说TAH的含义,是 ...

  2. 算法第四版学习笔记之快速排序 QuickSort

    软件:DrJava 参考书:算法(第四版) 章节:2.3快速排序(以下截图是算法配套视频所讲内容截图) 1:快速排序 2:

  3. nyoj n-1位数

    n-1位数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的 ...

  4. 职场选择之大公司 VS 小公司

    其实这是个非常难回答的问题,很多职场新人都会有类似的顾虑和疑问. 这个问题就好比业界比较容易引起争议的编程语言哪个是最好的一样.大公司还是小公司里面发展,只有身处其中才能体会,如人饮水,冷暖自知. 笔 ...

  5. PHP之this和self

    self在对象中自己调用自己使用 $this在实例化后使用$this方法 在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就 ...

  6. iot前台开发环境:前后台访问映射

    一.前端映射- java代码 二.路由设置 -前台代码 三.访问应用

  7. GIT入门笔记(18)- 标签创建和管理

    git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a <tagname> -m "blablabla ...

  8. 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧

    原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...

  9. Windows10+Docker搭建分布式Redis集群(SSH服务镜像)(二)

    前言:上篇文章我们搭建好了Docker,下面我们开始使用Docker创建镜像,Docker命令就不介绍了.这里宿主是Windows10,cmd的管理和后期文件的复制不是很方便,将创建支持SSH的Cen ...

  10. ZOJ-1649 Rescue---BFS+优先队列

    题目链接: https://vjudge.net/problem/ZOJ-1649 题目大意: 天使的朋友要去救天使,a是天使,r 是朋友,x是卫兵.每走一步需要时间1,打倒卫兵需要另外的时间1,问救 ...