老瞎眼 pk 小鮮肉 線段樹 區間離線

2021-10-02 05:55:09 字數 1656 閱讀 6096

題意:給出一段長度為n的序列,q次查詢區間(l,r)內異或為0最短子區間長度。

思路:假設區間[l,r]異或為0,那麼[1,l-1]的異或值等於[1,r]的異或值。那麼對於每個點,我們存以它為右端點的區間異或值為0的最短區間長度,再將查詢區間按右端點公升序排列。然後利用線段樹,從左到右遍歷:在這個點對應最短區間的左端點插入區間長度,如存在右端點等於當前遍歷節點的查詢區間,就去查詢[l,r],因為此時線段樹上已插入的點都是在他的右端點內,查詢到的點也都在他的左端點內。

**:

#include

using

namespace std;

int a[

500010];

int len[

1000000*4

],pre[

500010];

int c[

500010*4

];void

update

(int rt,

int l,

int r,

int pos,

int v)

int mid=

(l+r)/2

;if(pos<=mid)

update

(rt<<

1,l,mid,pos,v);if

(midupdate

(rt<<1|

1,mid+

1,r,pos,v)

; c[rt]

=min

(c[rt<<1]

,c[rt<<1|

1]);

return;}

intquery

(int rt,

int l,

int r,

int ll,

int rr)

int res=int_max;

int mid=

(l+r)/2

;if(ll<=mid) res=

min(res,

query

(rt<<

1,l,mid,ll,rr));

if(midmin(res,

query

(rt<<1|

1,mid+

1,r,ll,rr));

return res;

}struct acw[

500010];

bool

cmp(ac a1,ac a2)

int ans[

500010];

intmain()

len[sum]

=i;}

for(

int i=

1;i<=q;

++i)

sort

(w+1

,w+1

+q,cmp)

;int cnt=1;

for(

int i=

1;i<=n;

++i)

while

(w[cnt]

.r==i)

}for

(int i=

1;i<=q;

++i)

return0;

}

牛客練習賽53 老瞎眼 pk 小鮮肉 線段樹思維

傳送門 給定長度為n nn的陣列,q qq個詢問 每次問 l,r l,r l,r 內最小的區間長度 l,r l,r l,r 使得al al 1 ar 0 a l oplus a oplus a 0 al al 1 a r 0 明顯需要預處理 如果做乙個異或字首和pre x pre x pre x 那...

牛客練習賽53 E 老瞎眼 pk 小鮮肉

problem 這題的題意大概是 給出一段長度為 n 的區間 q 次詢問求 l r 這個區間內 最短的一段區間 l r 使得 oplus a j 0 l l 誒 離線麼?樹狀陣列好像不好做啊 因為大多數人只會單點修改區間修改和差分吧 考慮離線 線段樹 我們先記錄乙個 sum i oplus i a ...

小A的題 線段樹區間賦值

小a的題 描述 由於小 a 實在是太菜了,因此他現在需要你的幫助 現在小 a 手上有乙個凌亂的 01 串,他想通過若干次對於這個 01 串的區域性排序將它變成乙個有趣的 01 序列。現在有兩種操作 輸入格式 l r 00 表示把區間 l,r 給公升序排序 l r 11 表示把區間 l,r 給降序排序...