學習報告:主席樹真的nb,如果樸素做要開n個線段樹,記憶體**,優化的方式,每次插入乙個數,並不是整個權值線段樹都改變了,只是改變logn個節點,我們只需要多開logn個節點就ok,用root陣列記錄歷史個線段樹版本,詢問區間,可以做相減,詢問第k小值,與左樹的所有節點sum作比較,如果小就在左邊,否則在右邊,在右邊的時候注意是k-sum,由於值域太大,可以使用離散化,獲得每個數的排名,可以把值域縮小到n。
#include#include#include#include#include#include#include#include#include#define il inline
#define x first
#define y second
typedef long long ll;
using namespace std;
const int n=200010;
struct nodetr[n*40];
int root[n];
int w[n],cnt;
vectorv;
int getid(int x)
void modify(int l,int r,int pre,int &now,int k)
int query(int l,int r,int l,int r,int k)
int main()
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i=1;i<=n;i++)
while(m--)
return 0;
}
主席樹(區間第k小)
k th number 求區間內第k小的數。主席樹的板子題 主席樹左子樹存小值,右邊大值,用sum記錄一下子樹節點個數。對 l,r 的查詢區間,root r root l 1 可得出 l,r 的差值,也就是大小的個數 include include include include include i...
主席樹 區間第k小
主席樹 權值線段樹 可持久化 權值線段樹 在此處指各個數字在某個區間內出現的次數 那麼第一棵權值線段樹會記錄 1,1 的數字出現次數 第n棵權值線段樹會記錄 1,n 的數字出現次數 例 數列為110001 第一棵權值線段樹記錄為tree1 0 0 tree1 1 1 第二棵權值線段樹記錄為tree2...
區間第K值 主席樹詳解
序 這是一篇遲到的題解,機房的小夥伴們系統地學主席樹應該是七月份的時候,然而我沒趕上趟,當時壓根沒看懂主席樹是什麼東東。昨天晚上決定重新來過,於是請教了一位大神1113 這是他的部落格,不過好像因為手機驗證的原因很久沒有更新了 他告訴我了主席樹的始末,然後我就秒懂了,原來並沒有想象中的那麼複雜,相信...