首页 > 其他分享 >[ARC178C] Sum of Abs 2 题解

[ARC178C] Sum of Abs 2 题解

时间:2025-01-22 23:42:22浏览次数:1  
标签:ARC178C 题解 Sum filename int main sum define

首先想到能不能用差分搞搞,但是给自己绕进去了 /kel

我们不妨给 \(\{b_L\}\) 定个不降的序(如果打在数轴上,显然序和答案无关),于是可以拿掉绝对值。
注意到这个和式(记其结果为 \(x\) )中每个 \(b_i\) 的贡献系数 \(c_i = 2i - L - 1\),于是有:

\[x = \sum_{i = 1}^{L}b_ic_i \]

直接做不好处理最大值。\(\{b_n\}\) 有序,想到 Abel 变换(记 \(b_0=0,s_i = \sum_{j = i}^{L} c_j,d_i = b_i - b_{i-1}\)
):

\[\begin{aligned} x & = \sum_{i = 1}^{L}(b_i-b_{i-1})\sum_{j = i}^{L}c_j \\ & = \sum_{i = 1}^{L} d_is_i \end{aligned} \]

答案等价于最小化 \(\sum d_i\)。
显然 \(d_i\ge0\),且可以证明(打表) \(s_i \ge 0\),于是就可以把上面的式子看做背包的过程,跑一遍背包即可。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define all(v) v.begin(), v.end()
#define int long long
using namespace std;

//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)
//#define multi_cases 1

namespace Traveller {
	const int N = 2e5+2;
	
	int n, L;
	int sum[N], f[N];
	
	void main() {
		cin >> n >> L;
		for(int i = L; i >= 1; --i) sum[i] = sum[i+1] + 2*i - L - 1;
		memset(f, 0x3f, sizeof(f));
		f[0] = 0;
		for(int i = 1; i <= L; ++i)
			for(int j = sum[i]; j <= 2e5; ++j)	//完全背包
				f[j] = min(f[j], f[j - sum[i]] + 1);
		for(int i = 1, a; i <= n; ++i) {
			scanf("%lld ", &a);
			printf("%lld\n", f[a] > 1e9 ? -1 : f[a]);
		}
	}
}

signed main() {
#ifdef filename
	FileOperations();
#endif
	
	signed _ = 1;
#ifdef multi_cases
	scanf("%d", &_);
#endif
	while(_--) Traveller::main();
	return 0;
}

关于时间复杂度:
记值域为 \(V\)。
我的代码中双重循环看起来什么没加,是 \(O(VL)\) 的,但是注意到 sum 数组增速很快,是平方级别的,也就是说他会在 \(O(\sqrt{V})\) 次就超出 \(2 \times 10^5\),不进行二重循环。
于是复杂度就是 \(O(V \sqrt{V})\),可能带点常数。

标签:ARC178C,题解,Sum,filename,int,main,sum,define
From: https://www.cnblogs.com/wfc284/p/18686958

相关文章

  • CF2061G Kevin and Teams 题解
    题目描述这是一道交互题。\(T\)组数据,一张\(n\)个点的无向完全图,边权\(\in\{0,1\}\),边权未知。你需要先输出最大的\(k\),满足无论每条边的边权是什么,都能找出\(2k\)个不同的点\(\{u_1,\cdots,u_n,v_1,\cdots,v_n\}\),使得边\((u_i,v_i)\)的权值同时为\(0\)或同时......
  • Codeforces Round 998 (Div. 3)(部分题解)
    补题链接A. Fibonacciness思路:了解清楚题意,求得是最大的斐波那契的度,数组只有5个数(最多度为3),能列出其对应的式子 或 或#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn,m,k;vector<int>a(4);set<int>s;......
  • 题解:洛谷 P1803 凌乱的yyy / 线段覆盖
    题目https://www.luogu.com.cn/problem/P1803题目大意给定  条线段,第  条线段放在位置 ,现在你需要从这些线段中拿出一些,使得剩下的线段不会重叠。思路考虑贪心。可以发现,按照左端点从小到大排序毫无意义(虽然样例能过)。因此考虑按右端点从小到大排序。然后尽量多放......
  • AtCoder ABC326C 题解
    题目链接问题陈述Takahashi在数字线上放置了\(N\)个礼物。第\(i\)个礼物放置在坐标\(A_i\)处。您将在数轴上选择长度为\(M\)的半开区间\([x,x+M)\),并获得其中包含的所有礼物。更具体地说,你根据以下程序获得礼物。首先,选择一个实数\(x\)。然后,获取坐标满足\(......
  • C. Game of Mathletes(题解)
    首先Alice擦一个数a,然后Bob再擦一个数b,只有当a+b=k的时候才可以得分,Alice想要最小化分数而Bob想要最大化分数,所以如果给定的数中存在两个数的和为k,那么当Alice擦掉其中一个的时候Bob一定会擦掉另一个来得分,而且题目给定的数组长度为偶数,所以我们只需要运用双指针的思想找到数组......
  • 常见问题解决 --- 引用的账户当前已锁定,且可能无法登录什么意思
     当你在尝试登录Windows系统时,看到错误提示“引用的账户当前已锁定,且可能无法登录”,这意味着你使用的用户账户由于多次输入错误的密码而被系统锁定。这是一种安全机制,旨在防止暴力破解或未经授权的访问。原因分析1.多次输入错误密码:如果连续多次输入错误的密码,系统会自......
  • 题解:P11600 『Fwb』流星の陨落
    『Fwb』流星の陨落题目描述流星雨来了!当然,这场流星雨确确实实是Fwb设计的。Fwb在天空中放置了许多的流星,同时也在地面上放置了许多的烟花。当流星和烟花发生碰撞时,就会出现美丽而独特的风景。由于方便控制流星雨的发射,流星的发射是有规律的,这个发射的规律叫做流星间隔。我......
  • 「CF1437F」Emotional Fishermen 题解
    小水题一道Description有n\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满......
  • 「CF618F」Double Knapsack 题解
    只能说。。。Description给你两个可重集 \(A,B\),\(A,B\) 的元素个数都为 \(n\),它们中每个元素的大小 \(x\in[1,n]\)。请你分别找出 \(A,B\) 的子集,使得它们中的元素之和相等。\(n\leq10^6\)。Solution将找子集强化成找子段(不知道怎么想的),令\(sa_{n}\)表示\(A\)......
  • 「CF1854D」Michael and Hotel 题解
    逆天交互题、、、我只能说阈值分治赛高!!!Description有一个有 \(n\) 个点的内向基环树森林,zlsim位于 \(1\) 号节点,请你通过以下操作求出哪些节点(包括 )可以通过从这两点开始沿边行走若干步汇至一点。给出两个参数 \(u,k\) 和点集 \(S\),询问是否能够通过从 \(u\) 出......