【Luogu】P3332K大数查询(树套树)
这题我费尽心思不用标记永久化终于卡过去了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大数查询(树套树)的更多相关文章
- 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 ...
- Cogs 1345. [ZJOI2013] K大数查询(树套树)
[ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...
- ZJOI2013 K大数查询 和 LG3380【模板】二逼平衡树(树套树)
K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c:如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的 ...
- BZOJ 3110 k大数查询 & 树套树
题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...
- 数据结构(树套树):ZJOI 2013 K大数查询
有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...
- BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...
- bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】
树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
随机推荐
- UVA 11987 Almost Union-Find (单点修改的并查集)
此题最难处理的操作就是将一个单点改变集合,而普通的并查集是不支持这种操作的. 当结点p是叶子结点的时候,直接pa[p] = root(q)是可以的, p没有子结点,这个操作对其它结点不会造成任何影响, ...
- 一些常用的HTML标签
由于本人目前没有系统学习,日常碰见哪个有用就记下来. pre标签 可定义预格式化的文本,在pre元素中的文本会保留空格和换行符.比如我们展示源代码的时候,只要放一个pre标签,然后把代码直接复制.粘贴 ...
- nfs-ganesha使用
一 nfs-ganesha在centos7上安装 yum -y install centos-release-gluster yum install -y nfs-ganesha.x86_64yum ...
- C 语言设计坦克大战(未完成)
//坦克大战 //0.提示界面 //1.边框 //2.指定位置显示自己的坦克 //3.己方坦克随着方向键动起来 //getasynkeustae //Sleep(毫秒) //减少闪烁 //不闪烁Set ...
- python之函数默认参数的坑
坑 当你的默认参数如果是可变的数据类型,你要小心了 例题 # 正常没毛病的操作 def func(a,b=False): print(a) print(b) func(1,True) # 在实参角度, ...
- fei33423 工作 职场 格言
对老板: 1. 老板不知道你做的事情(目标设定) 2. 老板要的是规划(对上报告), 自己给自己设定 金字塔四位下的目标,各种维度.如何细化. 2.1 明确老板期望 2.2 与老板达成共识 2.3 ...
- oracle系統表、數據字典介紹與日常問題診斷
oracle系統表.數據字典介紹與日常問題診斷 數據字典是由唯讀的table和view組成的,產生於$oracle_home\rdbms\admin\catalog.sql.裡面儲存Oracle資料庫 ...
- 【wqs二分 决策单调性】HHHOJ#261. Brew
第一道决策单调性…… 题目描述 HHHOJ#261. Brew 题目分析 挺好的……模板题? 寄存了先. #include<bits/stdc++.h> typedef long long ...
- Docker自学纪实(一)Docker介绍
先简单了解一下,做个记录,以便不时之需. Docker简介:Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依 ...
- Vue之数据传递
基础:vue的响应式规则 简单的props更新 父组件 <template> <div> <block-a :out-data="x">< ...