線段樹 離散區間,單點維護區間

2022-05-19 03:19:32 字數 1491 閱讀 5309

這道題當時用線段樹搞不行,用主席樹搞,也不行。當場自閉。。。

其實當時想到離散,但是沒想到用單點維護線段樹的區間。。。。。。

你這樣想,無非就是2e6次詢問,最多1-e9被分成最多2e6區間,我們要求的位置,一定在這2e6點的右邊第乙個。

那麼把這個點,以及這個點x以及x+1的點儲存下來。

維護的時候,線段樹初始化所有的單點值為1,並維護區間和,代表單點沒有被刪掉。

我們優先往左查詢,並保證不越過區間之外,如果查詢到滿足條件的,我們不再往後繼續查詢,否則往右查詢。

#include#include

#include

#include

#include

#define ll long long

#define lson rt<<1

#define rson rt<<1|1

using

namespace

std;

const

int maxx = 2e6+6

;struct

nodetree[maxx

<<2

];int

op[maxx],pos[maxx];

vector

p;intcnt,ans;

int get_pos(int

x)void buildtree(int rt,int l,int

r)

int mid=(l+r)>>1

; buildtree(lson,l,mid);

buildtree(rson,mid+1

,r);

tree[rt].cnt=tree[lson].cnt+tree[rson].cnt;

}void update(int rt,int

pos)

int mid=(l+r)>>1

;

if (pos<=mid)

else

tree[rt].cnt=tree[lson].cnt+tree[rson].cnt;

}int flag=0

;void query(int rt,int ql,int

qr)

return

; }

int mid=(l+r)>>1

;

if (!flag && ql<=mid &&tree[lson].cnt)

if (!flag &&tree[rson].cnt)

}int

main()

sort(p.begin(),p.end());

p.erase(unique(p.begin(),p.end()),p.end());

int sz=p.size();

buildtree(

1,1,sz);

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

else}}

return0;

}

線段樹 離散區間,單點維護區間

這道題當時用線段樹搞不行,用主席樹搞,也不行。當場自閉。其實當時想到離散,但是沒想到用單點維護線段樹的區間。你這樣想,無非就是2e6次詢問,最多1 e9被分成最多2e6區間,我們要求的位置,一定在這2e6點的右邊第乙個。那麼把這個點,以及這個點x以及x 1的點儲存下來。維護的時候,線段樹初始化所有的...

維護序列(線段樹維護區間乘 區間加)

給定乙個長度為n的原序列和模數mod,m個操作,a,b 區間乘c,a,b 區間加c,統計 a,b 的區間和。思路 線段樹維護的還是區間和,但是這裡我們需要用到兩個懶標記,乙個記錄加法,乙個記錄乘法,乘法懶標記下傳之後要重置為1而不是0。對於乙個乘法操作,他影響的是區間和還有這個區間的加法標記 乘法標...

線段樹維護區間01

g.小 w 開關燈 problem 4467 discussion description 晚上到家小 w 通過開關燈來保持自己神經的興奮以便清醒地理筆記。n n 2 n 100,000 2 n 100,000 盞燈被連續的編號為 1 n 1 n 剛回到家的時候,所有的燈都是關閉的。小w 通過 n ...