題意:給出一段長度為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 給降序排序...