HDU 5696 区间的价值 (百度之星2B)

来源:互联网 发布:jquery.base64.js用法 编辑:程序博客网 时间:2024/06/05 03:37

前言:

因为是完全随机数据,所以大概找一个平均复杂度是o(nlogn)的就可以了。原来和秦总一样用的RMQ+线段树+剪枝做的,但是一直T,可以参考一下秦总的代码。
然后网上看的其他的方法,因为数据完全随机,导致做法太多了。

分析:

暴力区间内最大值,然后向左向右扩展,直到比这个值大的那个数位置,更新这段内所有长度的最大值优先向大的数的那边扩展。基本就是xjb做一下就可以了。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <set>#include <map>#include <queue>#include <vector>#include <string>using namespace std;typedef long long LL;typedef vector <int>    VI;typedef pair <int,int>  PII;#define FOR(i,x,y)  for(int i = x;i < y;++ i)#define IFOR(i,x,y) for(int i = x;i > y;-- i)#define pb  push_back#define mp  make_pair#define fi  first#define se  secondconst int maxn = 1e5+5;const int inf = 1e9+7;int n,a[maxn];LL dp[maxn];void work(){    memset(dp,0,sizeof(dp));    FOR(i,0,n){        dp[1] = max(dp[1],(LL)a[i]*a[i]);        int l = i,r = i,minx = a[i];        while(l || r < n){            if(!l)  minx = min(minx,a[++r]);            else if(r == n-1)   minx = min(minx,a[--l]);            else if(a[l-1] > a[r+1])    minx = min(minx,a[--l]);            else    minx = min(minx,a[++r]);            if(a[r] > a[i] || a[l] > a[i])  break;            dp[r-l+1] = max(dp[r-l+1],(LL)minx*a[i]);            //printf("i:%d len:%d %d: %I64d\n",i,l,r,(LL)minx*a[i]);        }        //printf("\n");    }    FOR(i,1,n+1)    printf("%I64d\n",dp[i]);}int main(){    while(~scanf("%d",&n)){        FOR(i,0,n)  scanf("%d",&a[i]);        work();    }    return 0;}
0 0
原创粉丝点击