题目链接

  这题我费尽心思不用标记永久化终于卡过去了qwq

  权值线段树下面套一个区间线段树。然后乱搞搞即可。

  

// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cctype>
#define maxn 100050
#define mid ((l+r)>>1)
#define left (root<<1)
#define right (root<<1|1)
#define check(o) if(o==0) o=++segtot;
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} long long tree[maxn*];int segtot;
int segrt[maxn*];
int segls[maxn*];
int segrs[maxn*];
int tag[maxn*];
int rt[maxn*];
int q[maxn];
int n,m,cnt,size; void pushdown(int &root,int m){
check(root);
if(tag[root]==) return;
check(segls[root]);
check(segrs[root]);
int le=segls[root],ri=segrs[root];
tag[le]+=tag[root]; tag[ri]+=tag[root];
tree[le]+=tag[root]*(m-(m>>));
tree[ri]+=tag[root]*(m>>);
tag[root]=;
} void segup(int from,int to,int l,int r,int &root){
check(root);
if(from<=l&&to>=r){
tree[root]+=(r-l+);
tag[root]++;
return;
}
pushdown(root,r-l+);
if(from<=mid){
check(segls[root]);
segup(from,to,l,mid,segls[root]);
}
if(to>mid){
check(segrs[root]);
segup(from,to,mid+,r,segrs[root]);
}
tree[root]=tree[segls[root]]+tree[segrs[root]];
} long long segquery(int from,int to,int l,int r,int &root){
check(root);
if(from<=l&&to>=r) return tree[root];
pushdown(root,r-l+);
long long ans=;
if(from<=mid){
check(segls[root]);
ans+=segquery(from,to,l,mid,segls[root]);
}
if(to>mid){
check(segrs[root]);
ans+=segquery(from,to,mid+,r,segrs[root]);
}
return ans;
} void add(int o,int from,int to,int l,int r,int p){
segup(from,to,,n,segrt[o]);
if(l==r) return;
if(p<=mid) add(o<<,from,to,l,mid,p);
else add(o<<|,from,to,mid+,r,p);
} long long query(int o,int from,int to,long long l,long long r,long long e){
if(l==r) return l;
long long ans=segquery(from,to,,n,segrt[o<<|]);
if(ans>=e) return query(o<<|,from,to,mid+,r,e);
else return query(o<<,from,to,l,mid,e-ans);
} struct Que{
long long opt,a,b,c;
}que[maxn]; int main(){
n=read(),m=read();
for(int i=;i<=m;++i){
que[i]=(Que){read(),read(),read(),read()};
if(que[i].opt==) q[++cnt]=que[i].c;
}
sort(q+,q+cnt+);
size=unique(q+,q+cnt+)-q-;
for(int i=;i<=m;++i){
if(que[i].opt!=) continue;
que[i].c=lower_bound(q+,q+size+,que[i].c)-q;
}
for(int i=;i<=m;++i){
long long opt=que[i].opt,a=que[i].a,b=que[i].b,c=que[i].c;
if(opt==) add(,a,b,,size,c);
else printf("%lld\n",q[query(,a,b,,size,c)]);
}
return ;
}

【Luogu】P3332K大数查询(树套树)的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  3. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  4. ZJOI2013 K大数查询 和 LG3380【模板】二逼平衡树(树套树)

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

  5. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  6. 数据结构(树套树):ZJOI 2013 K大数查询

    有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...

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

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

  8. bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】

    树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...

  9. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

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

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

随机推荐

  1. 在DataGridView控件中验证数据输入

    实现效果: 知识运用: DataGridView控件的公共事件CellValidating //将System.Windows.Forms.DataGridViewCellValidatingEven ...

  2. python整体图

  3. OO作业第一单元总结

    一.第一单元作业回顾 ​ 系列一作业分为三周进行,都是表达式求导,难度渐进. ​ 第一次实现的是简单幂函数的求导,第二次加入了sin和cos两种三角函数,第三次实现了三角函数内的嵌套以及引入了表达式因 ...

  4. 4G 内存 怎么只有2.99G可用

    32为系统只可以识别3.25G,而且有256M的内存被显卡共享显存了,所以只剩2,99G.

  5. C#动态数组ArrayList

    在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 一.ArrayList类的常用属性和方法 1. ArrayList类 ...

  6. ORACLE中RECORD、VARRAY、TABLE、IS REF CURSOR 的使用及实例详解

    ORACLE中RECORD.VARRAY.TAB.IS REF CURSOR LE的使用及实例详解 create or replaceprocedure PRO_RECORD_ROW_TAB_EXAM ...

  7. ReactiveCocoa入门-part2

    ReactiveCocoa是一个框架,它能让你在iOS应用中使用函数响应式编程(FRP)技术.在本系列教程的第一部分中,你学到了如何将标准的动作与事件处理逻辑替换为发送事件流的信号.你还学到了如何转换 ...

  8. C++ string头文件

    转载自https://blog.csdn.net/superna666/article/details/52809007/ 作者 zhenzhenjiajia888 标准c++中string类函数介绍 ...

  9. C++ 学习笔记(五)类的知识小结一(重载,友元函数,静态成员,new)

    ---恢复内容开始--- 学习C++类知识点还是挺多的,每个知识点学习的时候都觉得这个知识点咋那么多东西,其实真学完了再回头看好像也就那么点.这次用程序写一个黑猫揍白猫的故事总结一下这段时间学习的零碎 ...

  10. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...