| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Disjoint-Set Data Structure 266MS#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double Pi=acos(-1.0);
typedef long long LL;
#define Set(a, s) memset(a, s, sizeof (a))
#define Rd(r) freopen(r, "r", stdin)
#define Wt(w) freopen(w, "w", stdout)
LL par[100001], s[100001];
int find(int x) { return x==par[x] ? x : par[x]=find(par[x]); }
void merge(int a, int b) { s[find(a)] += s[find(b)], par[find(b)] = find(a);}
LL N, h[100001], ref[100001];
bool comp(int a, int b) {
return h[a] > h[b];
}
int main ()
{
while(scanf("%lld", &N) && N) {
for (int i = 1; i <= N; i++)
scanf("%lld", &h[i]), ref[i]=i, s[i]=0;
sort(ref+1, ref+1+N, comp);
LL ans = 0;
for (int i = 1; i <= N; i++) {
s[ref[i]] = 1, par[ref[i]] = ref[i];
if (ref[i]<N && s[ref[i]+1]) merge(ref[i], ref[i]+1);
if (ref[i]>1 && s[ref[i]-1]) merge(ref[i], ref[i]-1);
ans = max(ans, s[par[ref[i]]] * h[ref[i]]);
}
printf("%lld\n", ans);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator