給你乙個序列a
每次兩個操作:
1.修改x位置的值為y
2.查詢區間l,r是否可以重排為值域上連續的一段
輸入格式:
第一行兩個數n,m
第二行n個數表示a[i]
後面m行每行三個數opt x y,或者opt l r,代表操作
輸出格式:
如果可以,輸出「damushen」
否則輸出「yuanxing」
輸入樣例#1:複製
5 51 2 3 4 5
2 1 5
2 2 3
2 3 3
1 3 6
2 3 5
輸出樣例#1:複製
damushendamushen
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...