题目链接:https://www.luogu.org/problemnew/show/P1533

没人写$fhq\ treap$做法,那我就补一篇qwq

看到这题第一时间想主席树,然后发现我还没学主席树,于是就写了平衡树做法(当然树状数组+二分的套路也是可以的,但是两个$log$的复杂度太优秀了就不写了)

其实和treap的写法差不多,也是排序一遍然后插入,删除,求$kth$

不过好写很多,主体就40+行,注意一开始那个节点的值一定要大...

我开$0x3f$然后挂了一个上午...

(其实一开始还写了莫队来着但是发现不需要)

#include <bits/stdc++.h>

#define ll long long
#define inf 0x7fffffff
#define il inline namespace io { #define in(a) a=read()
#define out(a) write(a)
#define outn(a) out(a),putchar('\n') #define I_int int
inline I_int read() {
I_int x = , f = ; char c = getchar() ;
while( c < '' || c > '' ) { if( c == '-' ) f = - ; c = getchar() ; }
while( c >= '' && c <= '' ) { x = x * + c - '' ; c = getchar() ; }
return x * f ;
}
char F[ ] ;
inline void write( I_int x ) {
if( x == ) { putchar( '' ) ; return ; }
I_int tmp = x > ? x : -x ;
if( x < ) putchar( '-' ) ;
int cnt = ;
while( tmp > ) {
F[ cnt ++ ] = tmp % + '' ;
tmp /= ;
}
while( cnt > ) putchar( F[ -- cnt ] ) ;
}
#undef I_int }
using namespace io ; using namespace std ; #define N 300010
#define int long long int n , tot = , root = ; //fhq-treap
struct fhq_treap {
int siz , val , lc , rc , rnk ;
} t[N] ;
void pushup(int rt) {t[rt].siz = t[t[rt].lc].siz + t[t[rt].rc].siz + ;}
void split(int &a , int &b , int val , int rt) {
if(!rt) { a = b = ; return ; }
if(t[rt].val <= val) a = rt , split(t[a].rc , b , val , t[rt].rc) ;
else b = rt , split(a , t[b].lc , val , t[rt].lc) ;
pushup(rt) ;
}
void merge(int a , int b , int &rt) {
if(!a || !b) {rt = a + b ; return ;}
if(t[a].rnk < t[b].rnk) rt = a , merge(t[a].rc , b , t[rt].rc) ;
else rt = b , merge(a , t[b].lc , t[rt].lc) ;
pushup(rt) ;
}
int new_node(int val) {
t[++tot] = (fhq_treap) { , val , , , rand()} ;
return tot ;
}
inline void insert(int val) {
int x = , y = , z = new_node(val) ;
split(x , y , val , root) ;
merge(x , z , x) ; merge(x , y , root) ;
}
void Del(int val) {
int x = , y = , z = ;
split(x , y , val , root) ; split(x , z , val - , x) ;
merge(t[z].lc , t[z].rc , z) ; merge(x , z , x) ; merge(x , y , root) ;
}
inline int find_val(int rnk , int rt) {
while(t[t[rt].lc].siz + != rnk) {
if(t[t[rt].lc].siz >= rnk) rt = t[rt].lc ;
else rnk -= t[t[rt].lc].siz + , rt = t[rt].rc ;
}
return t[rt].val ;
}
//fhq-treap end struct query {
int l , r , val , id;
} q[N] ;
int ans[N] , a[N] , block ; bool cmp(query a , query b) {
return a.l == b.l ? a.r < b.r : a.l < b.l ;
} signed main() {
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
srand((unsigned)time()) ;
n = read() ; int m = read() ;
new_node(inf) ; t[].siz = ;
for(int i = ; i <= n ; i ++) a[i] = read() ;
for(int i = ; i <= m ; i ++) q[i] = (query) {read() , read() , read() , i} ;
block = sqrt(n) ; sort(q + , q + m + , cmp) ;
q[].l = ;
for(int i = ; i <= m ; i ++) {
for(int cur = q[i-].r + ; cur <= q[i].r ; cur ++) insert(a[cur]) ;
for(int cur = q[i-].l ; cur < q[i].l ; cur ++) Del(a[cur]) ;
ans[q[i].id] = find_val(q[i].val , root) ;
}
for(int i = ; i <= m ; i ++) outn(ans[i]) ;
}

Luogu P1533 可怜的狗狗的更多相关文章

  1. luogu P1533 可怜的狗狗 |莫队+二分

    题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都有一个不同的漂亮值.漂亮 ...

  2. 【题解】Luogu P1533 可怜的狗狗

    原题传送门 莫队介绍,Splay介绍 离线的题目,莫队是不错的解决方法 先把询问排一下序 剩下就套一个莫队的板子 每来一只狗就把漂亮值插入平衡树 每去掉一只狗就把漂亮值从平衡树中删掉 每次查询查平衡树 ...

  3. 洛谷P1533 可怜的狗狗 [平衡树,FHQ_Treap]

    题目传送门 可怜的狗狗 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都 ...

  4. P1533 可怜的狗狗

    http://www.luogu.org/problem/show?pid=1533 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗 ...

  5. [Luogu 1533] 可怜的狗狗

    平衡树,我用的SBT. 排一下序尽量减少操作次数. 第K大询问. 以及插入删除. #include <algorithm> #include <cstdio> #include ...

  6. P1533可怜的狗狗

    困死了,完全做不下去题 就当是对莫队最最基本的思想的一个复习叭(只有最最基本的思想,没有莫队) 传送 我们可以很容易的想到这题要用线段树. 60pts 此题要求某个区间里第K小的数,可以暴力的考虑对每 ...

  7. AC日记——可怜的狗狗 洛谷 P1533

    可怜的狗狗 思路: 主席树第k大: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300001 #defin ...

  8. 【luoguP1533】可怜的狗狗

    题目链接 发现区间按左端点排序后右端点也是单调的,所以扫一遍就行了,用权值线段树维护第\(k\)大 #include<algorithm> #include<iostream> ...

  9. Splay详解

    平衡树实际很简单的 以下讲解都以Luogu P3369 [模板]普通平衡树为例 我不会带指针的Splay,所以我就写非指针型的Splay Splay是基于二叉查找树(bst)实现的 什么是二叉查找树呢 ...

随机推荐

  1. Integer VS AtomicInteger VS MutableInteger

    由于Integer是不可变的,每个循环增加key的value时会创建一个新的对象 每次value+1时不需要重新创建Integer对象 Integer, Boolean 等 is immutable, ...

  2. Spark Sort-Based Shuffle具体实现内幕和源码详解

    为什么讲解Sorted-Based shuffle?2方面的原因:一,可能有些朋友看到Sorted-Based Shuffle的时候,会有一个误解,认为Spark基于Sorted-Based Shuf ...

  3. 页面加载之window.onload=function(){} 和 $(function(){})的区别

    通用的页面加载js有四种方式: 1.window.onload = function(){}; —-js 2.$(window).load(function(){});——Jquery 3.$(doc ...

  4. Android APP安装后不在桌面显示图标的应用场景举例和实现方法

    最近在为公司做一款车联网的产品,由于公司本身擅长于汽车解码器的研发,所以该产品的诊断功能的实现除了使用目前市面上车联网产品中大量使用的OBD协议外,还会使用一些专车专用协议去实现一些特殊的诊断功能,如 ...

  5. [LeetCode] 221. Maximal Square _ Medium Tag: Dynamic Programming

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...

  6. 【Win7 x64】+【annaconda3】+ 【python3.5.2】+【tensorflow-gpu】 [最终配置 gtx 940mx + Cuda8.0+cudnn v5.1 + tensorflow-gpu1.0.0 ]

    1.安装cuda Toolkit 和cudnn (百度云可下载,版本需要对应) 2.配置环境变量: 3.安装cudnn(需要拷贝一些dll和lib来进行配置) 4.进入cmd,找到anaconda3的 ...

  7. shell应用技巧

    Shell 应用技巧 Shell是一个命令解释器,是在内核之上和内核交互的一个层面. Shell有很多种,我们所使用的的带提示符的那种属于/bin/bash,几乎所有的linux系统缺省就是这种she ...

  8. 摘要JSR168 PORLET标准手册汉化整理

    本规范汉化资源搜集整理于网上并由我作了些修改和添加,主要为适应大陆的语辞.用语及其他未译之处. 由于本人于水平有限,如有错误,请各位高手指正:若有高见,希望不吝言辞,同为中国开源作项献. 特此严重感谢 ...

  9. 电子地图/卫星地图下载并转存为jpg图片

    1.下载水经注万能地图下载器破解版 http://download.csdn.net/download/hyb2012/8714725,此软件为绿色免安装且免注册 2.下载后解压缩后,运行sgwn.e ...

  10. LibSVM源码剖析(java版)

    之前学习了SVM的原理(见http://www.cnblogs.com/bentuwuying/p/6444249.html),以及SMO算法的理论基础(见http://www.cnblogs.com ...