luogu P3792 由乃與大母神原型和偶像崇拜

2021-10-24 12:46:00 字數 1933 閱讀 7998

題面傳送門

可以算一道線段樹維護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 那麼這個區間一定合法。主席樹比較麻煩?那就用線段樹維護乙個最大乙個最小值,乙個這個數第一出現的位置的最小值。如果 ...