题目链接

  这题我费尽心思不用标记永久化终于卡过去了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. 【UWP】【新坑】Excel批量翻译工具(1)

    嗯……具体思路是这样的.使用的时候,你导入一个excel,直观地选择某些区域,选择语言点击翻译,就可以对多个单元格进行批量翻译,并且支持多种不同的导出格式(excel副本.txt文件……) 1,多种翻 ...

  2. IM云通信行业步入快车道,谁将成为代表中国的全球IM“独角兽”?

    2016年,Twilio的成功上市,以及抢眼的股价表现,拓宽了全球云通信行业的想象空间,行业内公司估值水平也集体上调. 在中国,IM云通信行业也从2016年开始进入了一个“黄金发展时期”,一批如融云. ...

  3. UVA208 Firetruck 消防车(并查集,dfs)

    要输出所有路径,又要字典序,dfs最适合了,用并查集判断1和目的地是否连通即可 #include<bits/stdc++.h> using namespace std; ; int p[m ...

  4. Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。

    package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...

  5. 接口的多态使用; 接口应用实例:U盘、打印机可以使用共同的USB接口,插入到电脑上实现各自的功能。

    接口的多态使用 接口应用实例:U盘.打印机可以使用共同的USB接口,插入到电脑上实现各自的功能.

  6. MySQL数据库的多种备份与多种还原

    一.备份 1.mysqldump 方法备份 mysqldump备份很简单,格式如下: mysqldump -u用户名 -p密码 数据库名> XX.sql 路径 例如: mysqldump -ur ...

  7. Golang 简单web测试

    // mhoso project main.go package main import ( "log" "net/http" "./controll ...

  8. CentOS 7 忘记root密码解决方法

    CentOS 7  root密码的重置方式和CentOS 6完全不一样,CentOS 7与之前的版本6变化还是比较大的,以进入单用户模式修改root密码为例: 1.重启机器,进入grub菜单的时候按e ...

  9. nginx的url重写

    1.1 简介 url重写由ngx_http_rewrite_module模块提供,默认会安装,但该模块功能的实现需要pcre.URL重写技术不仅要求掌握几个指令的语法.熟悉简单的正则表达式,还需要尽量 ...

  10. Geode 集群搭建,快速上手使用

    Geode 介绍: Geode是一个提供实时.一致访问大型分布式云平台下数据密集型应用的数据管理平台. Geode 通过跨多进程,把内存.CPU.网络资源和可选的本地磁盘汇集起来,来管理应用程序对象及 ...