GalaxyOJ 871 單調佇列

2021-08-09 00:24:57 字數 1640 閱讀 4645

problem 871: 棧

time limit: 1000 ms memory limit: 256000 kb

problem description

lyk有乙個棧,眾所周知的是這個資料結構的特性是後進先出的。

lyk感覺這樣子不太美妙,於是它決定在這個前提下將其改進,也就是說,每次插入元素時,可以在棧頂或者棧底插入,刪除元素時,只能在棧頂刪除。

lyk想知道每次執行完操作後當前棧中元素的最大值是多少。

第一行乙個數n表示操作次數。

接下來n行,每行兩個數a。若a<=1,則接下來輸入乙個數b。

若a=0,則在棧頂插入乙個數b。

若a=1,則在棧底插入乙個數b。

若a=2,則在棧頂刪除乙個數。

每次操作後,儲存當前棧中元素的最大值是多少。

保證任意時刻棧中至少含有乙個數。

由於運算元實在太多了。於是你可以採取這種方式讀入所有操作。讀入8個引數n,a,b,c,x0,a,b,mod(0<=a,b,c<=100000,a+b+c>0,0<=x0,a,b<=10^9,1<=mod<=10^9。)有xi=(xi−1∗a+b)%mod 。

對於第i次操作,若xi%(a+b+c)輸出可能很大,只需輸出將所有答案的總和對1e9+7取模後的結果即可。

input

讀入8個引數n,a,b,c,x0,a,b,mod。

對於30%的資料,1<=n<=5000

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

對於100%的資料,1<=n<=10000000

output

輸出將所有答案的總和對1e9+7取模後的結果

sample input

5 1 1 1 2 2 2 5

sample output

樣例解釋:

對應的xi:1 4 0 2 1

對應的操作:

0 1

0 4

0 0

2 1 1

對應的答案:

1 4

4 4

4

#include 

#define n 100000

long long q[2*n+5],p[2

*n+5],x,ans,l=n+1,r=n,i,k,n,a,b,c,a,b,ha,sz;

int main()

else

if (a<=(x

%(a+b+c)) && (x

%(a+b+c))//棧底插入

sz++;

for (k=1; q[r]

<=x && r>=l; r--) k+=p[r];

q[++r]=x,p[r]=k;

}else

if (a+b<=x

%(a+b+c))

ans=(ans+q[l])%1000000007;

}printf("%lld",ans);

}

單調棧,單調佇列

大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...

單調棧 單調佇列

單調棧 單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。leetcode 239 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...

單調棧 單調佇列

啊學完了來寫個總結吧 顧名思義,單調,就是指色彩單一某乙個容器裡面的元素都是遞增或遞減的,而單調棧和單調佇列就是這個容器。單調棧 單調棧模板 其他的我就不說了,講下為什麼單調棧是從後往前掃瞄 當我們在判斷乙個數後面第乙個比它大的數時,前提是後面的數已經被處理了,所以我們要從後往前掃瞄。我做了兩種做法...