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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客小白月赛13-H(单调栈+树状数组)

發(fā)布時間:2025/3/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客小白月赛13-H(单调栈+树状数组) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:https://ac.nowcoder.com/acm/contest/549/H

題意:給一個柱狀圖,包括每個矩陣的寬度和高度,求能組成的最大矩陣的面積。

思路:顯然最大矩陣的高一定為n個矩陣中的一個矩陣的高,所以不訪用單調(diào)棧求出每個矩陣左邊、右邊第一個高度小于該矩陣的下標(biāo)。然后用樹狀數(shù)組求出該區(qū)間的寬度和,遍歷一遍即可得到結(jié)果。算法復(fù)雜度O(nlogn),順便吐槽這題數(shù)據(jù),一朋友沒用單調(diào)棧暴力求區(qū)間,復(fù)雜度為O(n^2),竟然也過了。。

AC代碼:

#include<cstdio> using namespace std; typedef long long LL; const int maxn=1000005;int n,p; int h[maxn],stk[maxn],L[maxn],R[maxn]; LL tr[maxn],ans;int lowbit(int x){return x&(-x); }void update(int x,int num){while(x<=n){tr[x]+=num;x+=lowbit(x);} }int query(int x){int ans=0;while(x>0){ans+=tr[x];x-=lowbit(x);}return ans; }int main(){scanf("%d",&n);for(int i=1;i<=n;++i){int tmp;scanf("%d",&tmp);update(i,tmp);}for(int i=1;i<=n;++i)scanf("%d",&h[i]);h[0]=h[n+1]=0;stk[p=0]=0;for(int i=1;i<=n;++i){while(h[stk[p]]>=h[i]) --p;L[i]=stk[p]+1;stk[++p]=i;}stk[p=0]=n+1;for(int i=n;i>=1;--i){while(h[stk[p]]>=h[i]) --p;R[i]=stk[p]-1;stk[++p]=i;}for(int i=1;i<=n;++i){int w=query(R[i])-query(L[i]-1);if(1LL*w*h[i]>ans) ans=1LL*w*h[i];}printf("%lld\n",ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/FrankChen831X/p/10808617.html

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的牛客小白月赛13-H(单调栈+树状数组)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。