乙個長度為n 的序列,對於每個位置i 的數ai 都有乙個優美值,其定義是:找到序列中最長的一段[l, r],滿足l第一行輸入n 接下來n 個整數,代表ai 接下來q,代表有q 個區間接下來q 行,每行
兩個整數 l, r 表示區間的左右端點
對於每個區間的詢問,輸出答案
816 19 7 8 9 11 20 16
83 8
1 42 3
1 15 5
1 22 8
7 8
7313537
3
30%: n,q<=5070%: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 ...