洛谷 P2659 美麗的序列

2022-03-03 07:07:34 字數 1289 閱讀 6163

單調棧維護區間最小值,單調遞增棧維護區間最小值,

考慮當前數對答案的貢獻,不斷加入數,如果加入的數$>$棧頂,說明棧頂的元素對當前數所在區間是有貢獻的,同時加入當前的數。

反之,若當前加入的數比棧頂元素小,那麼棧頂元素(所謂的最小值)已經失去了價值,因為他不會再對後面的區間造成影響,所以彈出棧頂,同時更新$ans$

#include#include

#include

#define n 10000000

#define inf 0x7fffffff

#define ll long long

using

namespace

std;

ll ans,top;

struct

nodes[n];

intn;

intmain()

s[++top].pos=i,s[top].val=x;}}

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

ans=max(ans,1ll*(n-s[i-1].pos)*s[i].val);

printf(

"%lld

",ans);

return0;

}

線段樹查詢區間最小值,找到區間最小值的位置,不斷遞迴尋找最小值。

一段區間的價值即為$(r-l+1)*minn$

這種做法竟然沒有$tle$,神奇,難道就是因為他不斷遞迴找了最小值的位置嗎?

#include#include

#include

#define n 10000000

#define inf 0x7fffffff

using

namespace

std;

struct

nodetr[n];

intn;

long

long

ans;

void push_up(int

k)void build(int k,int l,int

r)

int mid=(l+r)>>1

; build(k

<<1

,l,mid);

build(k

<<1|1,mid+1

,r);

push_up(k);

}node query(

int k,int ql,int

qr)void slove(int l,int

r)int

main()

洛谷P2659 美麗的序列

題目 該題目可以用輔助陣列l i r i 來指向以data i 為最小值的左端點和右端點。然後最後列舉每個data i 尋找每個data i 的美麗值的最大值。然後輔助陣列可以用單調棧求出。include include include include include include define ...

洛谷P2659 美麗的序列

gd是乙個熱衷於尋求美好事物的人,一天他拿到了乙個美麗的序列。為了研究這個序列的美麗程度,gd定義了乙個序列的 美麗度 和 美麗係數 對於這個序列的任意乙個區間 l,r 這個區間的 美麗度 就是這個區間的長度與這個區間的最小值的乘積,而整個序列的 美麗係數 就是它的所有區間的 美麗度 的最大值。現在...

題解洛谷 P2659 美麗的序列

看到題解區基本全是單調棧,我來乙個不同的思路 用並查集來貪心。這是乙個比較經典的 trick,常用來批量處理一條鏈 一棵樹上路徑的最大或最小值問題,大致的思路是按順序列舉每一條邊,並查集維護連通塊來算貢獻。具體到本題,我們可以把數列抽象成一條 n 1 點 n 邊的鏈,i 與 i 1 之間的邊權為 a...