区间合并用并查集做~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+10000;
const int inf=1<<29;
struct Node{
int val;
int index;
bool operator < (const Node &a)const{
return val<a.val;
}
}a[maxn];
int n,p[maxn],ansl[maxn],ansr[maxn];
long long sum[maxn];
bool vis[maxn];
int find(int x)
{
if(p[x]==-1)
return x;
return p[x]=find(p[x]);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(sum,0,sizeof(sum));
memset(p,-1,sizeof(p));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].val);
a[i].index=i;
}
sort(a,a+n);
long long ans=-inf;
int ansleft,ansright;
for(int i=n-1;i>=0;i--)
{
vis[a[i].index]=1;
int x=find(a[i].index);
sum[x]+=a[i].val;
ansl[x]=ansr[x]=a[i].index;
if(sum[x]*a[i].val>ans)
{
ans=sum[x]*a[i].val;
ansleft=ansl[x];
ansright=ansr[x];
}
if(a[i].index>0&&vis[a[i].index-1])
{
int y=find(a[i].index-1);
sum[x]+=sum[y];
ansl[x]=min(ansl[x],ansl[y]);
ansr[x]=max(ansr[x],ansr[y]);
p[y]=x;
}
if(a[i].index<n-1&&vis[a[i].index+1])
{
int y=find(a[i].index+1);
sum[x]+=sum[y];
ansl[x]=min(ansl[x],ansl[y]);
ansr[x]=max(ansr[x],ansr[y]);
p[y]=x;
}
if(sum[x]*a[i].val>ans)
{
ans=sum[x]*a[i].val;
ansleft=ansl[x];
ansright=ansr[x];
}
}
printf("%I64d\n%d %d\n",ans,ansleft+1,ansright+1);
}
return 0;
}