luogu 2422 良好的感覺

2022-07-17 05:39:10 字數 1658 閱讀 5091

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

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

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

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

輸入 #1複製

6

3 1 6 4 5 2

輸出 #1複製

60
樣例解釋:

kkk最開心的一段時間是第3天到第5天,開心值:(6+4+5)*4=60

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

對於70%的資料,1<=n<=2000

對於100%的資料,1<=n<=100000,1<=感受值<=1000000

與這道題簡直一模一樣

這道題用區間的開頭結尾做狀態不太可行,但這道題對於區間還有一種狀態,最值

好啦,這種題,我們可以發現對於某乙個最小值,他的作用範圍最大化可以使答案盡可能大

所以直接求出每乙個最小值的作用範圍就好

古人云,不貳過,不遷怒,但是我這個俗人已經在longlong上摔倒過n次了

還有,因為單調佇列(單調棧)維護的是區間的最值,有單調性,所以取出來的數不一定是正好大於a[i]的數

這樣就好

1

/************************

2user:mandy.h.y

3language:c++

4problem:luogu2422

5algorithm:

6***********************

*/7 #include8

9using

namespace

std;

1011

const

int maxn = 1e5 + 5;12

13int

n;14

long

long

ans;

15long

long

sum[maxn],a[maxn];

16int

l,r,q[maxn];

17long

long

_left[maxn],_right[maxn];

1819 templateinline void read(t &x)

2526

void

file()

3031

void

readdata()

3435

void

work()

4344 l = r = 0;45

46for(int i = n;i >= 1; --i)

5051

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

52 ans = max(ans,(sum[_right[i]] - sum[_left[i]-1]) *a[i]);

53 printf("

%lld

",ans);54}

5556

intmain()

view code

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 ...

洛谷 P2422 良好的感覺

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

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

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