首页 > 其他分享 >CF1826D

CF1826D

时间:2024-09-01 21:25:18浏览次数:4  
标签:pre suf int res 区间 CF1826D

CF1826D

链接:

Problem - 1826D - Codeforces

题目大意:

给你一个数组,让你选择一个区间\([l, r]\)设选中的区间为\(b\),\(b_{i_1} + b_{i_2} + b_{i_3}\)为区间内前三大的值,你需要选择一个区间使得\(b_{i_1} + b_{i_2} + b_{i_3} - (r - l)\)值最大,输出最大值

思路:

  • 我们发现三个数一定是\(b_l,b_r\)还有区间内一个数,因为,如果左右两个端点不是最大的数,那么我们缩小区间不是更优吗
  • 我们考虑分项 \(b_l + l\) 一项, \(b_r - r\) 一项然后中间值一项,这样我们通过前缀后缀预处理,再枚举中间项就能得出答案

代码:

void solve(){
	int n;
	cin >> n;
	int a[n + 1];
	for(int i = 1;i<=n;i++) cin >> a[i];
	int pre[n + 2],suf[n + 2];
	memset(pre,0,sizeof pre);
	memset(suf,-0x3f,sizeof suf); 
	int res = 0;
	for(int i = 1;i<=n;i++) pre[i] = max(pre[i - 1],a[i] + i);
	for(int i = n;i>=1;i--) suf[i] = max(suf[i + 1],a[i] - i);	
	for(int i = 2;i < n;i++) res=max(res,pre[i - 1] + suf[i + 1] + a[i]);
	cout << res << endl;
}

时间复杂度

O(n)

标签:pre,suf,int,res,区间,CF1826D
From: https://www.cnblogs.com/bananawolf/p/18391757

相关文章

  • CF1826D
    原题翻译这题乍一看不太好做,当时还想了单调栈或改变枚举顺序之类的做法,但都不可做但仔细一想,我们发现答案的\(b_l\)和\(b_r\)一定会被选到,否则我们可以把没用的部分去掉,这样\(b_1+b_2+b_3\)的值不会变,\(r-l\)还会变小,这一步是缩小答案的范围然后我们发现这个条件还是很严格,因......
  • cf1826D
    一个区间的权值为最大的三个数的和-区间长度,求最大的权值。首先我们注意到,两个端点肯定是max,考虑反证法,假设当前选的是l,r区间,若两端不是max,则可以通过增大l,减小r来增加答案。(然而好像并没有什么用?)我们可以设\(f[i][1/2/3]\),表示到了第i个点,我们当前选了几个的最大贡献。那么根......
  • CF1826D Running Miles
    题意给你一个长度为\(n\)的序列\(b\),求下面这个式子的值:\[\max_{1\lel\lei\ltj\ltk\ler\len}(b_i+b_j+b_k-(r-l))\]\(n\le10^5\)。思路官方题解给出的做法使用了单调栈,这里给出一种不用栈的做法。首先,把题目的柿子优化下。显然,为了尽量地减小\(r-......