這道題當時用線段樹搞不行,用主席樹搞,也不行。當場自閉。。。
其實當時想到離散,但是沒想到用單點維護線段樹的區間。。。。。。
你這樣想,無非就是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 ...