ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【UVA1619】感觉不错 Feel Good

2022-01-15 09:02:19  阅读:161  来源: 互联网

标签:Good Feel sum UVA1619 -- && 区间 getchar


UVA1619 感觉不错 Feel Good

链接

UVA1619 感觉不错 Feel Good (luogu.com.cn)

题目大意

给出正整数 \(n\) 和一个长 \(n\) 的数列,要求找出一个子区间,使这个子区间的数字和乘上子区间中的最小值最大。输出这个最大值与区间的两个端点。

思路

用单调栈处理出每个数作为最小值的区间的左端点和右端点。

对于区间和,可以记录前缀和 \(\mathrm{sum}_{i}\)。

那么最后答案就是 \(\max\limits_{i=1}^{n}(\mathrm{sum}_{r_{i-1}}-\mathrm{sum}_{l_i})\cdot a_i\)​。

到这里还没有结束,UVa 没有 SPJ,所以要找到答案最大的情况下区间长度最小的。而且 UVa 的多组数据输出格式也很离谱,要在第二个数据开始在前面换行。

代码

const int N = 1e5 + 10;

inline ll Read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
	return x * f;
}

int n;
ll a[N], l[N], r[N], s[N], q[N];
ll ans, ansl, ansr;

int main() {
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	for (bool flag = 0; scanf ("%d", &n) != EOF; ) {
		flag? putchar(10): flag = 1;
		for (int i = 1; i <= n; i++) 
			a[i] = Read(), 
			s[i] = s[i - 1] + a[i];
		ans = a[1], ansl = ansr = 1;
		int t = 0; q[0] = 0;
		for (int i = 1; i <= n; i++) {
			for (; t && a[q[t]] >= a[i]; t--);
			l[i] = q[t], q[++t] = i;
		}
		t = 0; q[0] = n + 1;
		for (int i = n; i; i--)  {
			for (; t && a[q[t]] >= a[i]; t--);
			r[i] = q[t], q[++t] = i;
		}
		for (int i = 1; i <= n; i++) {
			ll tmp = a[i] * (s[r[i] - 1] - s[l[i]]);
			if (ans < tmp || (ans == tmp && r[i] - l[i] - 1 < ansr - ansl + 1))
				ans = tmp, ansl = l[i] + 1, ansr = r[i] - 1;
		}
		printf ("%lld\n%lld %lld\n", ans, ansl, ansr);
	}
	return 0;
}

标签:Good,Feel,sum,UVA1619,--,&&,区间,getchar
来源: https://www.cnblogs.com/GJY-JURUO/p/15806099.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有