首页 > 其他分享 >题解:AT_arc174_a [ARC174A] A Multiply

题解:AT_arc174_a [ARC174A] A Multiply

时间:2024-03-23 17:23:24浏览次数:24  
标签:int 题解 sum 区间 最值 答案 Multiply ARC174A

题传

先要将 \(C\) 分类。

  1. \(C > 0\),为了使答案更大,要乘上一个最大的区间和。
  2. \(C \le 0\),为了使答案更大,选择乘上一个最小的区间和,因为此时我们可以贪心地想,如果区间和越小,乘上一个负数或 \(0\) 后,答案减少得越小,甚至乘上负数,还会使答案增大,所以也可以用负负得正来解释。

当然我们也可以不进行操作。

要求区间和,我们选择前缀和即可。

因为前缀和求区间 \(l \sim r\) 的和是 \(sum_r - sum_{l - 1}\)。要求区间和的最值,我们固定 \(sum_r\) 就可以求 \(sum_{l - 1}\) 的最值,我们遍历一遍并动态维护一下区间和的最值即可。

注意 \(i \sim i + 1\) 我们可以视为不选区间与 \(C\) 相乘。

给一下代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;

inline int read() {
	int res = 0, f = 1; char c = getchar();
	while (c > '9' || c < '0') {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		res = (res << 1) + (res << 3) + (c ^ 48);
		c = getchar();
	}
	return f == 1 ? res : -res;
}

int n, c, a[(int)3e5 + 5], sum[(int)3e5 + 5];

signed main() {
	n = read(), c = read();
	for (int i = 1; i <= n; ++i) 
		a[i] = read(), sum[i] = sum[i - 1] + a[i];
	if (c > 0) {
		int ans = -1e18, mi = 0;
		for (int i = 1; i <= n; ++i) {
			mi = min(sum[i], mi);//求 sum[i-1] 的最值,下同。
			ans = max(ans, sum[i] - mi);//求和的最值,下同。
		}
		cout << sum[n] - ans + c * ans;//计算答案下同。
	}
	else {
		int ans = 1e18, mx = 0;
		for (int i = 1; i <= n; ++i) {
			mx = max(sum[i], mx);
			ans = min(ans, sum[i] - mx);
		}
		cout << sum[n] - ans + c * ans;
	}
	return 0;
}

标签:int,题解,sum,区间,最值,答案,Multiply,ARC174A
From: https://www.cnblogs.com/luckycloud/p/18091349

相关文章

  • P8756 [蓝桥杯 2021 省 AB2] 国际象棋 题解
    设计状态什么的就不讲了,这里是对其它题解的优化。怎么优化呢,我们可以知道的是我们只要明确了当前行的状态,上一行的可选集就是知道的,如果我们明确了当前行以及上一行的状态,那么上上行的可选集就是知道的,于是我们就可以使用二进制子集枚举来写,这样就减去了全部不合法的枝叶,我们可以......
  • CF794F Leha and security system 题解
    题目链接:CF或者洛谷首先观察到题目的修改\(x\rightarrowy\),是每个位置的\(x\)都要变,那就显然的拆位去算每一位的贡献。当然,你又发现\(x\rightarrowy\),这玩意属于值为\(x\)的位变化成\(y\),那么这个和普通的拆位区别就在于这是维护值域维的拆位,我们拆位\(0\sim9\)......
  • [HDU5396] Expression 题解
    每次合并两个数,做过石子合并的人都能看出来是区间dp。设状态\(dp_{i,j}\)表示区间\([i,j]\)中合并为一个数的所有情况之和。那么我们就可以枚举断点\(k\):\(b_k\)为\(+\):\([i,k]\)中的每种情况都要和\([k+1,j]\)中的每种情况产生一个贡献,所以总贡献为\(dp_{i,k}\ti......
  • 2024年3月22号题解
    Fliptile解题思路对于这个题目可以用递推来写因为每次翻转只会影响一个十字架的区域,所以如果我们知道第一行的情况,那么是不是只要把第一行的所有的1在对应的下一个行的相同位置进行翻转就可以把第一行的所有的1变成0呢(重要性质) 那么只要我们不断递推下去就可以得到最后一......
  • CF1946E 题解
    Blog赛场上差一点做出来。首先发现左右两部分是比较独立的,所以可以分开计算后合并。注意到我们可以把整个数集分成左右两部分,即\(\binom{n-1}{p_{m1}-1}\)。然后我们不妨只考虑左边。发现左边的最大值也已经确定,且最大值右边的所有数可以随便选,即\(\binom{p_{i+1}-......
  • CF1948G MST with Matching 题解
    洛谷题面CF题面题目要求一个最小值加上一个最大值的最小值,不好直接做,考虑转化。发现树是二分图,而由柯尼希定理可知二分图的最大匹配等于其最小点覆盖。这样就把求\(\min(\min_{\text{生成树}}+\max_{匹配})\)转化为了\(\min(\min_{生成树}+\min_{覆盖})\)。直接\(\math......
  • CF1618G Trader Problem 题解
    题目链接:CF或者洛谷本题挺有意思的,我们观察到\(\lek\)这个限制使得我们可以将原序列进行分组,把\(\lek\)的限制的元素放在一组中,那么根据题意,这组当中任意元素之间都是可以互相交换的,包括系统用品。那么假设一组中有\(x\)个自身的物品,\(y\)个系统物品,那么这\(x+y\)物......
  • uni-app/小程序自定义导航栏下拉刷新loading图标看不到问题解决
    实际效果图 我们在page.json中开启了自定义导航栏属性和下拉刷新属性后//开启下拉刷新"enablePullDownRefresh":true//自定义导航栏"navigationStyle":"custom"此时,页面中的下拉刷新三个小圆点会被我们的导航栏遮盖住,导致用户下拉刷新看不到loading效果,如下图:......
  • 20240322每日一题题解
    20240322每日一题题解Problem输入\(n\)个不大于\(10^5\)的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。第一行输入一个正整数\(n\),表示整数个数。第二行输入\(n\)个正整数\(a_i\),以空格隔开。输出一行,依次输出\(a_i\)中剩余的质数,以空格......
  • SQL的nvarchar类型的中文内容,显示有乱码问题解决
    今天上线一个ASP项目升级为MVC的项目。原系统的ASP语言保存到SQLserver中nvarchar字段内容显示乱码了(显示有&#代码)。下图是SQLmanagementstudio的结果截图:左1列是经修正转化的可正常显示右1列OriStr为原数据库中nvarchar的内容。(ASP程序保存到数据库的原始数据)【产生乱......