CPC3 H 喵喵的最長序列 RMQ 單調佇列

2021-06-26 14:07:07 字數 1412 閱讀 6601

time limit: 1 sec  

memory limit: 128 mb

submit: 3  

solved: 2 [

submit][

status][

web board]

喵喵剛做完lcs,lis,lcis啥的,突然想到乙個非常*****的問題。

給你乙個序列a,求乙個序列的最長連續子串a[i]~a[j]使得m<=max(a[i]~a[j])-min(a[i]~a[j])<=k(子串最大值減去最小值的結果大於等於m並且小於等於k)

多組資料

對於每組資料,第一行三個數n,m,k。

第二行有n個數,每兩個數直接用空格隔開

n<=100000,0<=a[i]<10^9,0<=m<=k<10^9

對於每組資料輸出乙個整數,表示滿足條件的最長子串的長度

5 2 3

1 1 0 3 2

5

分析:首先可以用st演算法預處理區間最值。

設d=max(a[i]~a[j])-min(a[i]~a[j]), 那麼在i不變的情況下增大j,d的值是不會變小的。

所以如果發現d>k,那麼j增大不會使其有解,所以應該i增大。

所以可以利用貪心的思想,順序掃瞄一遍即可求出最長串。

當然這道題的正解應該是單調佇列。

st演算法 o(nlogn):

#include #include #include #include #include #include #define inf 0x7fffffff

using namespace std;

typedef long long ll;

const int n = 1e5 + 10;

int st_max[n][32],st_min[n][32],log2[n];

int n,a[n];

void pre_st()

else if(x>k) l++;

else r++;

}printf("%d\n",ans);

}return 0;

}

單調佇列演算法o(n):

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int maxn=100010;

int n,a[maxn];

int m,k;

int q1[maxn],q2[maxn];

int main()

printf("%d\n",ans);

}}

CPC23 4 K 喵喵的神 數

題意 給出整數t,p,求c t,p mod p。解法 用盧卡斯定理。盧卡斯定理 解決c n,m mod p問題。lucas n,m,p c n p,m p lucas n p,m p,p 本題m p,所以lucas n,p,p 化簡得 n p p。盧卡斯定理的證明在網上找了好多都看不懂 以後有機會再...

小喵喵的新家

jzoj3441 小喵喵的新家 description 小喵喵和小聰聰從小就是好朋友 他們經常在一起玩耍 如今小喵已經厭倦了自己居住的環境,想請小聰聰為她建乙個新家。小喵喵天生多才多藝,對多種樂器頗有研究。對於生活中常見的圖形,她對圓形很感興趣,因此小聰聰決定為她建乙個圓形的新家。我們設新家在乙個平...

3281 喵喵的數學難題

3281 喵喵的數學難題 最近,喵喵一直在學習數學。他發現了,任意乙個正整數n,都可以被一素數整除。發現了這個結論的他特別高興。有一天,lls給了喵喵乙個數字n,一本正經地告訴他 你能求所有能整除n!的素數和其相應的數量嗎?喵喵想了想說 直接算不就好了嘛 lls笑了笑說 小老弟你還是太年輕 你能幫助...