P2422 良好的感覺

2021-10-08 03:00:11 字數 1826 閱讀 3054

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]中每一天感受值的和。現在給出 kkk 在連續 nn 天中的感受值,請問,在哪一段時間,kkk 感覺最舒適?

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

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

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

輸入 #1複製

6

3 1 6 4 5 2

輸出 #1複製

60
kkk 最開心的一段時間是第 33 天到第 55 天,開心值:(6+4+5)\times4=60(6+4+5)×4=60。

對於 30\%30% 的資料,1\le n\le 1001≤n≤100。

對於 70\%70% 的資料,1\le n\le 20001≤n≤2000。

對於 100\%100% 的資料,1\le n\le 1000001≤n≤100000,1\le \texttt\le 10000001≤感受值≤1000000。

最開始自己的想法是先st表預處理,然而發現這個l,r是不固定的,這樣去做o(n^2)的。然後看到有些大佬單次列舉求解(二分+區間最小檢驗) emm當然神仙們的過題辦法很多。

這裡的想法是轉化一下列舉的思路,最小值只有n個,那我們判最小值為n時,以這個n為中心向兩邊拓展,找到小於n的位置,兩邊同時找到這樣的區間就是最大的和區間。暴力的話選擇乙個i,再o(n)去掃一遍。o(n^2)

再進行優化就是o(n)單調棧預處理出每個點的左右極限區間

用單調棧求出左邊第乙個比當前元素i小的元素記作li​,右邊為ri​,於是我們可以再求一遍字首和,最後這個元素對應的答案就是:(sum[r[i]-1]-sum[l[i]]) * a[i]

對單調棧的模擬:

樣例:3 1 6 4 5 2

r[1]=2;(以後r[x]=i中x和i都是下標)

r[3]=4;

r[5]=6;

r[4]=6;

然後發現還有兩個點的最右端區間點沒有找到,說明這時候棧裡面的元素的最右端的節點是n+1;

左端同理;

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=1e5+10;

typedef long long ll;

ll n,m;

ll a[maxn];

ll r[maxn];

ll l[maxn];

ll sum[maxn];

ll stack[maxn];

ll top=0;

int main(void)

for(ll i=1;i<=top;i++) r[stack[i]]=n+1;

top=0;

//棧頭在左邊

for(ll i=n;i>=1;i--)

for(ll i=1;i<=top;i++) l[stack[i]]=0;

ll ans=-0x3f3f3f3f;

for(ll i=1;i<=n;i++)

cout

}

洛谷 P2422 良好的感覺

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

luogu 2422 良好的感覺

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

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

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