Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12205 | Accepted: 3957 |
Description
Input
Output
Sample Input
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
Sample Output
8 4000
Hint
Source
#include
#include
#include
using namespace std;
const int N = 100005;
typedef __int64 ll;
ll ans;
struct node
{
ll val;
int l,r,pa;
}lcm[N];
int n;
int stack[N];
int nextint()
{
char c;
int ret;
while(isspace(c = getchar()))
;
ret = c - '0';
while((c = getchar()) >= '0' && c <= '9')
ret = ret * 10 + c - '0';
return ret;
}
int build()
{
int i,j,top;
top = -1;
for(i = 1;i <= n;i ++)
{
j = top;
while(j >= 0 && lcm[stack[j]].val > lcm[i].val)
j --;
if(j != -1)
{
lcm[i].pa = stack[j];
lcm[stack[j]].r = i;
}
if(j < top)
{
lcm[stack[j + 1]].pa = i;
lcm[i].l = stack[j + 1];
}
stack[++ j] = i;
top = j;
}
return stack[0];
}
int dfs(int cur)
{
if(cur == -1)
return 0;
int num = dfs(lcm[cur].l) + dfs(lcm[cur].r) + 1;
//printf("%I64d:%d\n",lcm[cur].val,num);
ll tmp = num * lcm[cur].val;
if(tmp > ans)
ans = tmp;
return num;
}
void print(int cur)
{
if(cur == -1)
return;
printf("%d\n",lcm[cur].val);
print(lcm[cur].l);
print(lcm[cur].r);
}
int main()
{
int i;
while(n = nextint(),n)
{
for(i = 1;i <= n;i ++)
{
lcm[i].val = (ll)nextint();
lcm[i].l = lcm[i].r = lcm[i].pa = -1;
}
int root = build();
//print(root);
ans = 0;
dfs(root);
printf("%I64d\n",ans);
}
return 0;
}
//poj:6216K 47MS
//zoj:70ms 2532k
//hdu:31MS 3548K