題意:給定乙個陣列,每次查詢第l到r區間的第k大值
經過這題總算對可持久化線段樹有了些了解,我們開始先建一顆空樹,然後對於每次修改我們只會修改logn個點,我們可以新建logn個來避免每次都新建一顆線段樹導致的爆空間,
對於這題來說我們線段樹中維護的是這個區間的點的個數,插入的時候按權值大小插入,對於l到r我們可以通過1-r減去1-(l-1)來求出l到r的,對於第k大我們可以用求平衡樹第k大的做法,每次查詢節點個數看往左走還是往右走
#include#define fi firstview code#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define c 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pii pairusing
namespace
std;
const
double g=10.0,eps=1e-12
;const
int n=100000+10,maxn=200000+10,inf=0x3f3f3f3f
;int a[n],b[n],tot,rt[n*20],ls[n*20],rs[n*20],sum[n*20
];void build(int &o,int l,int
r)void update(int &o,int l,int r,int last,int
p)int query(int ss,int tt,int l,int r,int
x)void work(int
sz)void
debug()
intmain()
return0;
}/********************
14 2
4 1 3 2
2 3 2
*******************
*/
hdu2665(主席樹模板題)
求區間第 k 小。參考這類題目做法挺多的,例如 劃分樹。這裡使用主席樹再寫一發,不得不說主席樹相比而言要好寫的多,比起普通線段樹,主席樹就是復用了線段樹共有的資訊。可持久化資料結構講究的就是復用共有的資訊,可持久化 trie 的思想也是差不多的。includeusing namespace std ...
hdu2665 主席樹模板題
題目 區間k大值,區間極值很容易想到線段樹,如果k是個位數的話,可以考慮開k個域的線段樹 滾 又稱可持久化線段樹,函式式線段樹 也許是上面兩個字看的太長,同時主席兩字給人一種不明覺厲的感覺,so,嘿嘿嘿 關於主席樹的講解可以看這 先離散化,對每個點i,建乙個1 i的線段樹 大小是數字的個數 記錄該字...
hdu2665 可持續化線段樹
a的第一道可持續化線段樹。我是看這個看懂的 可持續化線段樹,主要思想就是利用歷史資訊,減少時間和記憶體花銷。比方有兩棵線段樹,但是他們只有乙個節點資訊不同。仔細一想,在這兩顆線段樹上,對應的 l,r 節點 只有log n 個節點不同。那麼,除了不同的節點,其他節點資訊,他們完全可以共用。關於這題解法...