第一層就是區間線段樹,第二層用fhq-treap來維護。
注意的是,askrank函式應減1因為這是在一坨區間裡的某一區間,要求的應是比自己小的數。
思路很簡單,所以**就是用來給大家器官移植的。
#pragma gcc optimize(2)
#include
#include
#include
const
int n =5*
1e4+
2, mod =
1e9+
7, m =
1e7, inf =
2147483647
;int z, p, q, rt, n, m, opt, a, b, c, w[m]
, val[m <<2]
, son[m <<2]
[2], key[m <<2]
, cnt, root[m <<2]
, siz[m <<2]
;inline
intmax
(const
int x,
const
int y)
inline
intmin
(const
int x,
const
int y)
inline
intread()
while
(isdigit
(s))
return x * f;
}inline
void
pushup
(const
int o)
intrandd()
inline
intbuild
(const
int x)
void
split
(const
int o,
const
int k,
int&x,
int&y)
else
pushup
(o);}}
intmerge
(const
int x,
const
int y)
else
}int
kth(
const
int o,
const
int k)
inline
intcreate
(const
int l,
const
int r)
return rt;
}void
build
(const
int o,
const
int l,
const
int r)
inline
intrank
(const
int o,
const
int k)
intaskrank
(const
int o,
const
int l,
const
int r,
const
int l,
const
int r,
const
int k)
inline
intaskval
(const
int l,
const
int r,
const
int k)
else
r = mid -1;
}return ans;
}inline
intdel
(int rt,
const
int pos,
const
int k)
void
delete
(const
int o,
const
int l,
const
int r,
const
int pos,
const
int k)
inline
intpre
(const
int o,
const
int k)
intaskpre
(const
int o,
const
int l,
const
int r,
const
int l,
const
int r,
const
int k)
inline
intlst
(const
int o,
const
int k)
intasklst
(const
int o,
const
int l,
const
int r,
const
int l,
const
int r,
const
int k)
inline
void
print
(int x)
if(x >9)
print
(x /10)
;putchar
(x %10+
'0');}
intmain()
else
if(opt ==2)
else
if(opt ==3)
else
if(opt ==4)
else
}return0;
}
拜拜! 二逼平衡樹
link 原題就叫這名字,雖然我並沒有看出來它二逼在 就是乙個線段樹套平衡樹的模板,挺好理解也挺好寫,除了手抖收穫了一片re之外一切都挺順利的,開了 o 2 隨便過 逃 include include include define zczc using namespace std const int...
模板 二逼平衡樹
試題分析 乙個十分裸的樹套樹板子 這也是乙個板子 線段樹中套平衡樹 treap 主要就有乙個不是平凡操作的,就是處理第 2 個操作時,因為其他操作確保每次複雜度在 o log 2 n 而 2 操作無法快速在 treap 中找到,所以就可以去二分乙個值,用 1 操作判斷即可,單次操作時間複雜度 o l...
二逼平衡樹(樹套樹)
傳送門 這道題的做法 我學的是最經典的線段樹套平衡樹。因為發現其實這題的題目描述和普通平衡樹非常的相似 只是這次是在給定的區間中。所以我們能想象到用線段樹維護區間,然後每個線段樹的節點都是一顆平衡樹,用於維護區間內資訊。以上操作除了操作2需要二分答案,複雜度是 o log 3n 剩下的都是 o lo...