區間第k大(主席樹)

2021-08-08 06:11:25 字數 892 閱讀 7116

學了一下主席樹模板題,當初看了網上的主席樹講解都沒有看懂,後面看了嗶哩嗶哩的uestc的主席樹,終於看懂了思想。每次更新的複雜度都為logn。

每次更新的話就是對要更新的點路徑上的點重新更加乙個,然後進行對沒有影響的那些進行連邊。然後用乙個root記錄每乙個線段樹的根節點下標。

//#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pairp;

#define fi first

#define se second

#define inf 0x3f3f3f3f

#define clr(x,y) memset(x,y,sizeof x)

#define pi acos(-1.0)

#define iter set::iterator

const int mod = 1e9 + 7;

const int maxn = 1e5 + 10;

const int n = 2;

struct nodetree[maxn * 40];

int n,m,q,cnt,a[maxn],root[maxn];

vectorv;

int getid(int x)

void update(int l,int r,int &x,int y,int pos)

int query(int l,int r,int x,int y,int k)

int main()

}return 0;

}

主席樹區間第K大

主席樹的實質其實還是一顆線段樹,然後每一次修改都通過上一次的線段樹,來新增新邊,使得每次改變就改變logn個節點,很多節點重複利用,達到節省空間的目的。1.不帶修改的區間第k大。hdu 2665 模板題 1 include2 using namespace std 3 define fopen fr...

主席樹求區間第k大

主席樹是可持久化線段樹,維護 權值個數 線段樹的字首和。相當於對每個區間 1,i 建立n顆線段樹。我們用乙個區間內的數的出現個數建線段樹,所以資料大小較大時一般進行離散化。建的是權值線段樹,即用數值作為區間,每個節點存該數出現的次數,所以query返回的其實是離散後的陣列b的下標idx,最終結果為b...

區間第k大的數 主席樹

套主席樹求區間第k小的數的模板,然後求區間 l,r 第k大的數就等於求區間 l,r 第r l 1 k小的數 下標從1開始 區間第k小值問題 有n個數,多次詢問乙個區間 l,r 中第k小的值是多少。查詢區間 l,r 中的第k小值 我們按照從1到n的順序依次將資料插入可持久化的線段樹中,將會得到n 1個...