1. 程式人生 > >UVA - 1619 Feel Good(掃描法)

UVA - 1619 Feel Good(掃描法)

最小 pan uva 分享 con feel ood ++ 思路

題目:

技術分享圖片

思路:

預處理出a[i]在哪個範圍區間內是最小的,然後直接遍歷a數組求答案就可以了。

這個預處理的技巧巧妙的用了之前的處理結果。(大佬tql)

代碼:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int
, int> P; const int maxn = 1000100; int r[maxn],l[maxn]; ll sum[maxn],a[maxn]; int n; int main(){ FRE(); int kase = 0; while(scanf("%d",&n)!=EOF){ sum[0] = 0; a[0] = a[n+1] = -1; for(int i=1; i<=n; i++){ scanf("%lld",&a[i]); sum[i] = sum[i-1
]+a[i]; l[i] = r[i] = i; } for(int i=1; i<=n; i++){//根據已經得到的範圍快速求出當前的最小值範圍 while(a[i] <= a[l[i]-1]){ l[i] = l[l[i]-1]; } } for(int i=n; i>=1; i--){ while(a[i] <= a[r[i]+1]){ r[i]
= r[r[i]+1]; } } int L=1,R=1;//當不知道具體的邊界的時候,就將邊界設為開頭 ll ans = a[1]*a[1]; for(int i=1; i<=n; i++){ ll tsum = sum[r[i]] - sum[l[i]-1]; if(ans < tsum * a[i]){ L = l[i]; R = r[i]; ans = tsum*a[i]; } } if(kase++){ printf("\n"); } printf("%lld\n",ans); printf("%d %d\n",L,R); } return 0; }

UVA - 1619 Feel Good(掃描法)