UVA1619 调半天了。。。
  • 板块灌水区
  • 楼主XingnoYi
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/16 21:00
  • 上次更新2024/3/16 22:11:02
查看原帖
UVA1619 调半天了。。。
735797
XingnoYi楼主2024/3/16 21:00

P2422 升级版,但是 UVA 太狗了。。。。。

#include <iostream>
#include <cstdio>
#define big long long
using namespace std;
big n,h[100005];
big stack[100005];
big sum[100005];
big ans = 0,ansl=1,ansr=1;
void f()
{
	for(big i = 1;i <= n;i++)
	    {
	        scanf("%lld",h+i);
	        sum[i] = sum[i-1]+h[i];
	    }
	    big len=0;
	    h[n+1]=0;
	    sum[n+1]=sum[n];
        for(big i = 1;i <= n+1;i++)
	    {
            if(len == 0)
	        {
	            stack[++len] = i;
	            continue;
	        }
	        while(len != 0 && h[stack[len]] >= h[i])
	        {
	            big l;
	            big now = len;
	            if(len >= 2)
                {
       	            l = stack[len-1];
	            }
	            else
	            {
		            l = 0;
	            }
	            big x = (sum[i-1]-sum[l])*h[stack[now]];
	            if(x > ans || (x==ans && i-1-(l+1)<ansr-(ansl+1)) || (x==ans && i-1-(l+1) == ansr-(ansl+1) && l+2<ansl+1))
	            {
	        	    ans = x;
	        	    ansl = l+1, ansr = i-1;
			    }
	            len--;
	         }
	         stack[++len] = i;
        }
}
int main()
{
	scanf("%lld",&n);
	f();
	printf("%lld\n",ans);
	printf("%lld %lld",ansl,ansr);
    while(scanf("%lld",&n)!=EOF)
    {
	    f();
		printf("\n\n");
		printf("%lld\n",ans);
		printf("%lld %lld",ansl,ansr);
    }
	return 0;
}
2024/3/16 21:00
加载中...