(單調棧 線段樹)2478 小b接水

2021-09-20 12:46:33 字數 1982 閱讀 8268

2 秒262,144 kb

20 分

3 級題

小b將n個寬度相同的積木順序擺在一起,如下圖所示。

現在她告訴你每個積木的高度(可能為0)。

她想知道如果她從高處倒下一杯水,最多有多少單位的水能被積木接住?

假設每個積木的寬度都為1。

上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,最多可以接 6 個單位的水(藍色部分表示水)。 

收起

第一行乙個正整數n,其中0題解:分類討論: 1>   右邊存在比當前值大的            2  1   32>   右邊不存在比當前值大的        5   1   2    3   1     3    1     25   1   2    3   1     3       算乙個區間3    1     2      算乙個區間很顯然,第一種用單調棧就行;第二種用map記錄一下右邊第一次出現某個值的位置(移動時用),用線段樹求出當前值                           右邊最大值,顯然,這麼組合是最優的。

#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps (1e-8)

#define max 0x3f3f3f3f

#define u_max 1844674407370955161

#define l_max 9223372036854775807

#define i_max 2147483647

#define re register

#define pushup() tree[rt]=max(tree[rt<<1],tree[rt<<1|1])

#define nth(k,n) nth_element(a,a+k,a+n); // 將 第k大的放在k位

#define ko() for(int i=2;i<=n;i++) s=(s+k)%i // 約瑟夫

#define ok() v.erase(unique(v.begin(),v.end()),v.end()) // 排序,離散化

using namespace std;

inline int read()

while(c >= '0' & c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}typedef long long ll;

const double pi = atan(1.)*4.;

const int m=1e3+5;

const int n=5e5+5;

int a[n],l[n],r[n],tree[n];

stacks1,s2;

void sett(int l,int r,int rt)

int mid=l+r>>1;

sett(l,mid,rt<<1);

sett(mid+1,r,rt<<1|1);

pushup();

}int findd(int x,int y,int l,int r,int rt)

int main()

int p=1,ans=0;

while(p

int d=a[p];

for(int i=p+1;i

ans+=d-a[i];

p=r[p];

}printf("%d\n",ans);

return 0;

}

單調棧 線段樹

sequence 時間限制 c c 3秒,其他語言6秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld your are given two sequences a1 na a1 n and b1 nb b1 n you need to answe...

NOIP模擬 奇襲 線段樹 單調棧

題意 給定數列,求有多少個區間滿足區間最大 1 區間最小 區間長度 滿足條件為 m ax 1 m in r 1 l ma x mi n r lmax 1 min r 1 l max min r l max 1 min r 1 l ma x mi n r lma x mi n l rmax min l...

最大數(線段樹 單調棧)

寫線段樹的話太裸了,但是題意非常難搞,認真讀題 其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。重新賦值 從題解上看到一種單調棧的寫法覺得非常巧妙 利用了題目的特性 每次都是在最後詢問,用單調棧維護,開兩個棧乙個儲存下...