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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[hdu] 5696 区间的价值 || 序列分治

發布時間:2025/4/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [hdu] 5696 区间的价值 || 序列分治 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原題

我們定義“區間的價值”為一段區間的最大值*最小值。
一個區間左端點在L,右端點在R,那么該區間的長度為(R?L+1)。
求長度分別為1~n的區間的最大價值。
保證數據隨機


因為保證數據隨機,所以我們可以考慮用區間的最大值把這個區間分為兩個部分,這樣答案的貢獻就有兩種情況。
1、在同一個區間里
2、跨過最大值,在兩個區間里

情況1通過遞歸就變成了情況2,而情況二我們通過two-points來完成。記錄l指針和r指針,因為所求為最大值,所以選取l和r指針較大的內個加入,并每次更新答案即可。
因為數據隨機,所以O(nlogn)

#include<cstdio> #include<algorithm> #include<cstring> #define N 100010 typedef long long ll; using namespace std; ll n,ans[N],a[N];ll read() {ll ans=0,fu=1;char j=getchar();for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;if (j=='-') j=getchar(),fu=-1;for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';return ans*fu; }void solve(int l,int r) {if (l>r) return ;ll mx=0,pos,mn;for (int i=l;i<=r;i++)if (a[i]>mx) mx=a[i],pos=i;int ll=pos-1,rr=pos+1;mn=mx;ans[1]=max(ans[1],mx*mx);while (ll>=l && rr<=r){if (a[ll]<a[rr]) mn=min(a[rr],mn),rr++;else mn=min(a[ll],mn),ll--;ans[rr-ll-1]=max(ans[rr-ll-1],mx*mn);}while (ll>=l) mn=min(a[ll],mn),ll--,ans[rr-ll-1]=max(ans[rr-ll-1],mx*mn);while (rr<=r) mn=min(a[rr],mn),rr++,ans[rr-ll-1]=max(ans[rr-ll-1],mx*mn);solve(l,pos-1);solve(pos+1,r); }int main() {while (~scanf("%lld",&n)){memset(ans,0,sizeof(ans));for (int i=1;i<=n;i++)a[i]=read();solve(1,n);for (int i=1;i<=n;i++)printf("%lld\n",ans[i]);}return 0; }

轉載于:https://www.cnblogs.com/mrha/p/8031212.html

總結

以上是生活随笔為你收集整理的[hdu] 5696 区间的价值 || 序列分治的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。