日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P2422 良好的感觉

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2422 良好的感觉 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.luogu.com.cn/problem/P2422

題目描述

kkk 做了一個人體感覺分析器。每一天,人都有一個感受值?A_iAi?,A_iAi??越大,表示人感覺越舒適。在一段時間?\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

{3}

R[1]=2;(以后R[X]=I中X和I都是下標)

{1}

{1,6}

R[3]=4;

{1,4}

{1,4,5}

R[5]=6;

{1,4}

R[4]=6;

{1}

{1,2}

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

左端同理;

#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> using 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) {LL n;cin>>n;for(LL i=1;i<=n;i++) cin>>a[i];for(LL i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];//top表示在棧中頂頭元素是棧中從左往右數的第幾個 //棧頭在右邊 for(LL i=1;i<=n;i++){while(top!=0&&a[stack[top]]>=a[i]) R[stack[top]]=i,top--;stack[++top]=i;}for(LL i=1;i<=top;i++) R[stack[i]]=n+1;top=0;//棧頭在左邊 for(LL i=n;i>=1;i--){while(top!=0&&a[stack[top]]>=a[i]) L[stack[top]]=i,top--;stack[++top]=i;}for(LL i=1;i<=top;i++) L[stack[i]]=0;LL ans=-0x3f3f3f3f;for(LL i=1;i<=n;i++){ans=max(ans,a[i]*(sum[R[i]-1]-sum[L[i]]));}cout<<ans<<endl;return 0; }

總結

以上是生活随笔為你收集整理的P2422 良好的感觉的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。