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取模,將所得答案插入到數列的末尾。重新賦值 從題解上看到一種單調棧的寫法覺得非常巧妙 利用了題目的特性 每次都是在最後詢問,用單調棧維護,開兩個棧乙個儲存下...