【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 = ...
随机推荐
- Sequence II
6990: Sequence II 时间限制: 3 Sec 内存限制: 128 MB提交: 206 解决: 23[提交][状态][讨论版][命题人:admin] 题目描述 We define an ...
- 接口的多态使用; 接口应用实例:U盘、打印机可以使用共同的USB接口,插入到电脑上实现各自的功能。
接口的多态使用 接口应用实例:U盘.打印机可以使用共同的USB接口,插入到电脑上实现各自的功能.
- Java中什么是匿名对象,空参构造方法输出创建了几个匿名对象,属性声明成static
package com.swift; //使用无参构造方法自动生成对象,序号不断自增 public class Person { private static int count; //如果在定义类时 ...
- C语言结构体和共用体_07
概述 定义结构体类型变量的方法 结构体变量的引用 结构体变量的初始化 结构体数组 指向结构体类型数据的指针 用指针处理链表 共用体 枚举类型 用 typedef定义类型 概述 定义一个结构体的一般形 ...
- 使用filter函数筛选出素数
function getPrimeNumber(arr) { return arr.filter(function (number) { if (typeof number !== 'number' ...
- poj3525 Most Distant Point from the Sea
题目描述: vjudge POJ 题解: 二分答案+半平面交. 半径范围在0到5000之间二分,每次取$mid$然后平移所有直线,判断半平面交面积是否为零. 我的eps值取的是$10^{-12}$,3 ...
- 【php】【特殊案例】数组调用方法
As of PHP 5.4.0, you can call any callable stored in a variable. <?php class Foo { static functio ...
- java上传附件,批量下载附件(一)
上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...
- python面试题之什么是lambda函数?
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用l ...
- Applied Nonparametric Statistics-lec8
Ref:https://onlinecourses.science.psu.edu/stat464/print/book/export/html/11 additive model value = t ...