*【牛客 - 318B】签到题(单调栈,水题)
生活随笔
收集整理的這篇文章主要介紹了
*【牛客 - 318B】签到题(单调栈,水题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
?
眾所周知,IG是英雄聯盟S8世界總決賽冠軍,奪冠之夜,數億人為之歡呼!
賽后某百分百勝率退役ADC選手的某表情包意外走紅,某茍會長看到此表情包也想模仿。
于是有n個友愛的萌新決定每人都送會長一根長為ai面包。(數據保證沒有面包的長度相等)
會長無聊時把面包擺成一排,他驚人地發現他喜歡這樣一類區間,區間[i, j]滿足條件:
區間里的面包沒有比左端點i號面包短的,同時也沒有比右端點j號面包長的。
Gey會長在思考這樣一個問題:
?
所有滿足條件的區間中j-i的最大值是多少?
輸入描述:
t組數據。
每組樣例第一行輸入整數n,接下來一行輸入n個正整數。
(t≤30, n≤1000, ai≤1000000)
輸出描述:
輸出滿足條件的區間中j-i的最大值。示例1
輸入
復制
2 4 5 4 3 6 4 6 5 4 3輸出
復制
1 0解題報告:
? n=1e4其實可以直接暴力,不需要單調棧。。(當做復習了)
? 但是最后還是枚舉的端點n^2了,,這題好像可以直接On的單調棧吧。。就跟那個暑假的題一樣的單調棧、、、抽空補了
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<stack> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; int n; int a[MAX]; ll ans; int R[MAX]; int L[MAX]; stack<int> sk;//遞增棧 int main() {int t;cin>>t;while(t--) {cin>>n;for(int i = 1; i<=n; i++) scanf("%d",a+i);//記錄左側第一個比它大的 while(!sk.empty()) sk.pop();for(int i = 1; i<=n; i++) {while(!sk.empty() && a[i] >= a[sk.top()] ) sk.pop();if(sk.empty()) L[i] = 0;else L[i] = sk.top();sk.push(i);}int ans = 0;for(int i = 1; i<=n; i++) {int minn = 0x3f3f3f3f,tar=L[i]+1;for(int j = L[i]+1; j<=i; j++) {if(a[j] <= minn) {tar=j;minn=a[j];}}ans = max(ans,i-tar);}// printf("%d %d\n",L[4],R[4]);printf("%d\n",ans);}return 0 ;}?
總結
以上是生活随笔為你收集整理的*【牛客 - 318B】签到题(单调栈,水题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为了躲开傻贵的雪糕刺客:我这大冤种一口气
- 下一篇: 【牛客 - 369F】小D的剑阵(最小割