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

2022-05-11 01:42:06 字數 1552 閱讀 9430

給你乙個序列a

每次兩個操作:

1.修改x位置的值為y

2.查詢區間l,r是否可以重排為值域上連續的一段

輸入格式:

第一行兩個數n,m

第二行n個數表示a[i]

後面m行每行三個數opt x y,或者opt l r,代表操作

輸出格式:

如果可以,輸出「damushen」

否則輸出「yuanxing」

輸入樣例#1:複製

5 5

1 2 3 4 5

2 1 5

2 2 3

2 3 3

1 3 6

2 3 5

輸出樣例#1:複製

damushen

damushen

damushen

damushen

對於30%的資料,n,m<=500

對於60%的資料,n,m<=100000

對於100%的資料,n,m<=500000

值域1e9

2s這道題主要是要知道乙個用平方和來體現雜湊的思想。

那就是在區間中最小值到最大值的平方之和是唯一的(立方和一樣)。

於是我們就可以用線段樹儲存區間最大值,最小值和平方和,來進行操作。

#include#include#include#include#include#define ll long long

#define il inline

#define db double

#define max(a,b) ((a>b)?(a):(b))

#define min(a,b) ((a'9')

while(ch>='0'&&ch<='9')

return x*y;

}int a[500005],tmax[2000005],tmin[2000005],tsum[2000005];

il void build(int rt,int l,int r)

int m=(l+r)>>1;

build(rt<<1,l,m);

build(rt<<1|1,m+1,r);

tmax[rt]=max(tmax[rt<<1],tmax[rt<<1|1]);

tmin[rt]=min(tmin[rt<<1],tmin[rt<<1|1]);

tsum[rt]=tsum[rt<<1]+tsum[rt<<1|1];

}il int querymax(int rt,int l,int r,int l,int r)

il int he(int x,int y)

int main()

if(he(minx,maxn)==sum)

printf("damushen\n");

else

printf("yuanxing\n");

} else

update(1,1,n,l,r);

}return 0;

}

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

題意 給你n個數,q次詢問,每次詢問 有 題解 如果這題不帶修改,很多人都會想到,直接用主席樹維護乙個最大值最小值,然後查詢區間不同數的個數,如果不同數的個數等於maxn minn 1 那麼這個區間一定合法。主席樹比較麻煩?那就用線段樹維護乙個最大乙個最小值,乙個這個數第一出現的位置的最小值。如果 ...

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

無 n nn個數,若干組詢問,每一次詢問 l,r l,r l,r 中是否經過排序可以形成值域嚴格上公升的序列。顯然用分塊的思想 記錄上乙個和當前相等的數是否在當前塊外 很容易實現,參見hh的項鍊 有些類似,好像不是一回事,但我找不到之前做的這樣的題了 但時間複雜度卻承受不了。於是想到了線段樹來維護,...

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

題面傳送門 可以算一道線段樹維護hash的模板題了吧。hash要滿足兩個條件 相同的數hash值一定一樣與hash衝突盡量少。這道題hash序列可以用冪次方來hash 然後用線段樹隨便維護一下就好了。實現 include include define max a,b a b a b define m...