校內模擬CSP S T2

2021-09-27 13:51:15 字數 1874 閱讀 5601

乙個長度為n 的序列,對於每個位置i 的數ai 都有乙個優美值,其定義是:找到序列中最

長的一段[l, r],滿足l第一行輸入n 接下來n 個整數,代表ai 接下來q,代表有q 個區間接下來q 行,每行

兩個整數 l, r 表示區間的左右端點

對於每個區間的詢問,輸出答案

8

16 19 7 8 9 11 20 16

83 8

1 42 3

1 15 5

1 22 8

7 8

731

3537

3

30%: n,q<=50

70%:n,q<=2000

100%:n<=2000,q<=100000,ai<=200

對於所有資料,滿足n <= 2000, q <= 100000, ai <= 200

#include

#define int long long

using

namespace std;

const

int n=

2e3+10;

int n;

/*假設要查詢的區間為 [ l, r ],我們用 l 表示區間 [ l , r ] 的長度,即 l = r - l + 1,下面用 k 表示 log l

其中查詢的話,區間長度 l 不一定剛好是 2 的多少次方,又因為 log l 是向下取整,那麼 2^k 就有可能小於 l,這樣的話,我們就不能直接用 f [ l ][ k ] 來表示答案,不然的話會有遺漏

正確的做法是我們就從 l 往右取 2^k 個(即 f [ l ][ k ]),從 r 往左取 2^k 個(即?f [ r - ( 1 << k ) + 1 ][ k ]),

這樣就能保證區間 [ l , r ] 都被訪問到了,重複計算的不用擔心,這是計算最值而不是求和

那麼答案answer = max */

inline

intread()

while

(isdigit

(c))

cnt *

= f;

return cnt;

}int a[n]

,v[n]

,st[n][25

];//st[n][log 2 n]

int s[n<<1]

;//s代表狀態

inline

intprermq

(int l,

int r)

j--;return

max(st[l]

[j],st[r-(1

<][j]);

//數列中下標在[i,i+2的i次方-1]最大值

}signed

main()

for(

int i=

1;i<=n;i++

)else

} q=

0;v[i]

=i-s[n]+1

;//狀態長度

for(

int j=i+

1;j<=n;j++)}

else}}

st[i][0

]=v[i]

;//初始化 st[i][0]=a[i]

}for

(int j=1;

(1<<=n;j++)}

int l,r,q;

q=read()

;for

(int i=

1;i<=q;i++

)return0;

}

校內模擬題2

水題 但是原地螺旋炸裂 都不好意思貼 了qwq 問題背景 zhx 和他的妹子聊天。問題描述 考慮一種簡單的加密演算法。假定所有句子都由小寫英文本母構成,對於每乙個字母,我們將它唯一地對映到另乙個字母。例如考慮對映規則 a b,b c,c d,d a.那麼單詞 bad 就會被對映為 cba。這個對映規...

校內模擬 鎖

沒有標籤是因為我真的不知道這算什麼型別 這題我說不來大意你們還是看題面描述吧 小z住的房子一共有n個人,他們每人有乙個重要度。房子的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙...

校內模擬 assignment(DP)

題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...