luogu P2422 良好的感覺 單調棧

2022-05-08 12:45:11 字數 1115 閱讀 7656

kkk做了乙個人體感覺分析器。每一天,人都有乙個感受值ai,ai越大,表示人感覺越舒適。在一段時間[i, j]內,人的舒適程度定義為[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。現在給出kkk在連續n天中的感受值,請問,在哪一段時間,kkk感覺最舒適?

輸入格式:

第一行為n,代表資料記錄的天數

第二行n個整數,代表每一天的感受值

輸出格式:

一行,表示在最舒適的一段時間中的感受值。

題解: 

看上去無從下手,不妨列舉那個最不舒服的感受值(即一段區間中最小值).

令 $f_$ 表示 $i$ 位置為最小值所能擴充套件的最大區間的感受值之和.

用乙個單調遞增的佇列維護最小感受值.

考慮新加入乙個元素 $a_$.

如果當前隊首大於 $a_$,那麼 $i$ 就是隊首能擴充套件到的最大位置了,彈出隊首,把隊首的 $f_$ 值加上 $sum(i-1)-sum(j)$,一直反覆彈棧操作.

最後,將 $a_$ 推進.

因為棧時單調遞增的,$a_$ 再棧中前乙個元素肯定小於等於 $a_$,所以當前的貢獻就是 $f_=sum(i)-sum(q_)$.

但是.....1. 多個元素大小相等怎麼辦 ? 2. 到最後都彈不掉怎麼辦 ?

在最後加入乙個 0,即可解決上述問題. 

#include#define maxn 1000000 

#define ll long long

using namespace std;

void setio(string s)

int s[maxn],top,n;

ll f[maxn],sumv[maxn],arr[maxn];

int main()

f[i]=sumv[i]-sumv[s[top]];

s[++top]=i;

} ll ans=0;

for(int i=1;i<=n;++i) ans=max(ans,f[i]*arr[i]);

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

return 0;

}

Luogu P2422良好的感覺(單調棧)

題目鏈結 寫 能力需要極大提公升。我在五分鐘之內想到了單調棧,然後花了乙個小時的時間去看我單調佇列為啥寫錯了 首先這題需要轉換自己的思維。列舉所有 最小點 然後看它往左往右最大能擴充套件多少。維護乙個單調遞增的序列,彈棧時就會是這種情況 設被彈出去的元素是s,那它為什麼會被彈出去呢?因為它比當前元素...

P2422 良好的感覺

kkk 做了乙個人體感覺分析器。每一天,人都有乙個感受值 a ia i a ia i 越大,表示人感覺越舒適。在一段時間 left i,j right i,j 內,人的舒適程度定義為 left i,j right i,j 中最不舒服的那一天的感受值 times left i,j right i,j ...

luogu 2422 良好的感覺

kkk做了乙個人體感覺分析器。每一天,人都有乙個感受值ai,ai越大,表示人感覺越舒適。在一段時間 i,j 內,人的舒適程度定義為 i,j 中最不舒服的那一天的感受值 i,j 中每一天感受值的和。現在給出kkk在連續n天中的感受值,請問,在哪一段時間,kkk感覺最舒適?第一行為n,代表資料記錄的天數...