權值線段樹學習筆記

2022-06-02 06:36:10 字數 2839 閱讀 2878

定義:

struct segmenttree

tree[maxn<<2];

建樹:
void build(int p, int l, int r)

int mid = (l + r) >> 1;

build(lson, l, mid);

build(rson, mid+1, r);

//pushup()

}

單點更新:
void change(int p, int x)

int mid = (l(p) + r(p)) >> 1;

if(x <= mid) change(lson, x);

else change(rson, x);

//pushup()

}

詢問整體第\(k\)小:
//詢問整個區間第k小

//s(p)代表l(p)到r(p)值域中樹的個數總和

int query(int p, int k)

鏈結

思路:**:

#include#includeusing namespace std;

typedef long long ll;

const int maxn = 2e5 + 10;

int a[maxn], num[maxn], u[maxn];

int n, m, len;

struct segmenttree

tree[maxn<<2];

void build(int p, int l, int r)

void change(int p, int x)

int mid = (l(p) + r(p)) >> 1;

if(x <= mid) change(lson, x);

else change(rson, x);

s(p) = s(lson) + s(rson);

}//詢問整個區間第k大

//s(p)代表l(p)到r(p)值域中樹的個數總和

int query(int p, int k)

int main()

for(int i = 1; i <= n; i++)

scanf("%d", &u[i]);

sort(num + 1, num + 1 + m);

len = unique(num + 1, num + 1 + m) - num - 1;

build(1, 1, len);

int cnt = 0, k = 0;

while(n != cnt)

cout << num[query(1, ++k)] << endl;

}return 0;

}

鏈結

題意描述:

思路:**:

#includeusing namespace std;

typedef long long ll;

const int maxn = 5e5 + 10;

ll ans;

int n, a[maxn], num[maxn], len;

struct segmenttree

tree[maxn<<2];

inline void pushup(int p)

inline void build(int p, int l, int r)

inline void change(int p, int x)

int mid = (l(p) + r(p)) >> 1;

if(x <= mid) change(lson, x);

else change(rson, x);

pushup(p);

}ll query(int p, int x)

int main()

build(1, 1, n);

sort(num + 1, num + 1 + n);

len = unique(num + 1, num + 1 + n) - num - 1;

for(int i = 1; i <= n; i++)

for(int i = 1; i <= n; i++) //列舉每個a(i)作為右端點

cout << ans << endl;

return 0;

}

鏈結

題意描述:

#includeusing namespace std;

const int maxn = 3e5 + 10;

int t, n, m, k, cas;

struct segmenttree

tree[maxn<<2];

void pushup(int p)

void build(int p, int l, int r)

int mid = (l + r) >> 1;

build(lson, l, mid);

build(rson, mid+1, r);

pushup(p);

}int query(int p, int k)

void change(int p, int x, int val)

int mid = (l(p) + r(p)) >> 1;

if(x <= mid) change(lson, x, val);

else change(rson, x, val);

pushup(p);

}int main()

printf("case %d: %lld\n", ++cas, ans);

}return 0;

}

學習筆記 權值線段樹

雖然題解很多,也有權值線段樹,但我的和他們似乎不盡相同,跑的也挺快。所謂權值線段樹,就是用線段樹來儲存權值。那什麼是權值呢?似乎小學初中學統計的時候了解到,他是描述數在資料中比例大小的量,這裡用作此數出現的次數。做法顯然。我們用 cnt i 表示第 i 個數出現的次數,那麼可以這樣 void upd...

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...

權值線段樹

include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...