【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 = ...
随机推荐
- Berkeley DB (VC6.0 编译环境配置)
操作系统:winxp VC环境:VC6.0 必需文件:Berkeley DB安装文件(db-.msi) 下载地址:http://www.oracle.com/technology/software/p ...
- javascript报错:ReferenceError: $ is not defined解决办法
原因很简单,要么是未导入jquery包,要么是导入的顺序不对. 例如,我在制作Chrome扩展程序时,其中的一块代码如下: 然后运行时报上述错误. 解决方法:我们不难发现script位置有问题,因为$ ...
- CentOS7-samba文件共享服务
简介: Samba,是在Unix上实现SMB(Server Message Block)的一个工具套件.而SMB通常是windows用来实现共享的,包括文件和打印机等.而Unix上装上SMB,则使得U ...
- css3中的nth-child和nth-of-type的区别
实例: 首先创建一个HTML结构 <div class="post"> <p>我是文章的第一段落</p> <p>我是文章的第二段落& ...
- NOIP2016 toy
题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...
- 【MySql】Mysql ERROR 1067: Invalid default value for ‘date’ 解决
在给一个表添加字段的时候,忽然发现会报一个date类型的字段的默认值错误,郁闷~ 经过排查,原来是MySQL的配置问题,在wamp下,MySQL 5.7里是没有设置 SQL_MODE 的. 1.my. ...
- java实现验证码功能
java实现验证码功能 通过java代码实现验证码功能的一般思路: 一.通过java代码生成一张验证码的图片,将验证码的图片保存到项目中的指定文件中去,代码如下: package com.util; ...
- angular5 HttpInterceptor使用
HttpInterceptor接口是ng的http请求拦截器,当需要拦截http请求,可以实现该接口. 1.创建HttpInterceptor 的实现类,并使用@Injectable()注解 @Inj ...
- 能力不足之 根据时序图转化为Verilog代码
不能够把时序图看的非常透彻,然后把时序图写成Verilog代码,有时候甚至搞不清楚信号之间的时序关系.
- oracle如何保证读一致性 第二弹
Oracle之数据库一致性读的原理 在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(I ...