題面傳送門
可以算一道線段樹維護hash的模板題了吧。
hash要滿足兩個條件:相同的數hash值一定一樣與hash衝突盡量少。
這道題hash序列可以用冪次方來hash
然後用線段樹隨便維護一下就好了。
**實現:
#include
#include
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using
namespace std;
int n,m,k,x,y,z,smax[
2000039
],smin[
2000039
],l,r,mid,tots[
500039];
unsigned
long
long sum[
2000039
],a[
500039
],ans1,ans2,ans3,now[
500039];
inline
void
jianshu
(int l,
int r,
int now)
int m=
(l+r)
>>1;
jianshu
(l,m,now<<1)
;jianshu
(m+1
,r,now<<1|
1); smax[now]
=max
(smax[now<<1]
,smax[now<<1|
1]);
smin[now]
=min
(smin[now<<1]
,smin[now<<1|
1]);
sum[now]
=sum[now<<1]
+sum[now<<1|
1];}
inline
void
get(
int x,
int y,
int l,
int r,
int now)
int m=
(l+r)
>>1;
if(x<=m)
get(x,y,l,m,now<<1)
;else
get(x,y,m+
1,r,now<<1|
1); smax[now]
=max
(smax[now<<1]
,smax[now<<1|
1]);
smin[now]
=min
(smin[now<<1]
,smin[now<<1|
1]);
sum[now]
=sum[now<<1]
+sum[now<<1|
1];}
inline
void
find
(int x,
int y,
int l,
int r,
int now)
int m=
(l+r)
>>1;
if(x<=m)
find
(x,y,l,m,now<<1)
;if(y>m)
find
(x,y,m+
1,r,now<<1|
1);return;}
intmain()
for(i=
1;i<=n;i++
) a[i]
=tots[r];}
jianshu(1
,n,1);
for(i=
1;i<=n;i++)}
}
luogu P3792 由乃與大母神原型和偶像崇拜
無 n nn個數,若干組詢問,每一次詢問 l,r l,r l,r 中是否經過排序可以形成值域嚴格上公升的序列。顯然用分塊的思想 記錄上乙個和當前相等的數是否在當前塊外 很容易實現,參見hh的項鍊 有些類似,好像不是一回事,但我找不到之前做的這樣的題了 但時間複雜度卻承受不了。於是想到了線段樹來維護,...
Luogu 3792 由乃與大母神原型和偶像崇拜
題面 題目太長怎麼往上放 a 直接說做法吧 要問能不能使這一段區間內的數連續 首先想到的就是最大值減最小值是不是等於區間長度 但是元素可能是重複的 所以我們還要記乙個區間平方和 如果上面的情況已經不符合就直接輸出 否則再判斷一下區間平方和是不是相同 這樣就保證正確了 include include ...
P3792 由乃與大母神原型和偶像崇拜
題意 給你n個數,q次詢問,每次詢問 有 題解 如果這題不帶修改,很多人都會想到,直接用主席樹維護乙個最大值最小值,然後查詢區間不同數的個數,如果不同數的個數等於maxn minn 1 那麼這個區間一定合法。主席樹比較麻煩?那就用線段樹維護乙個最大乙個最小值,乙個這個數第一出現的位置的最小值。如果 ...