首页 > 其他分享 >20241022 校测T1 链链链(chain)题解

20241022 校测T1 链链链(chain)题解

时间:2024-10-23 08:50:42浏览次数:1  
标签:链链 chain int 题解 最大值 max 复杂度 断开

Problem 链链链 chain

你有一个长度为 \(n\) 的链,编号为 \(i (1 ≤ i < n)\) 的边连接着结点 \(i\) 与 \(i + 1\) 。每个结点 \(i\) 上有一个整数 \(a_i\)。你需要做以下操作 \(n − 1\) 次:
• 选择一条还未被断开的边,设其连接了点 \(i\) 与 \(i + 1\) ,将其断开。
• 断边后,对于所有与 \(i\) 联通的点 \(j\) ,找到 \(a_j\) 的最大值,设其为 \(x\) 。对于所有与 \(i + 1\) 联通
的点 \(k\) ,找到 \(a_k\) 的最大值,设其为 \(y\) 。
• 此次操作的代价为 \(|x − y|\) 。
求做完 \(n − 1\) 次操作的代价之和的最小值。

Input

输入的第一行包含两个整数 \(c, t\) ,表示测试点编号与测试数据组数。对于样例,\(c\) 表示该样例与测试点 \(c\) 拥有相同的限制条件。
接下来,对于每组测试数据:
第一行包含一个整数 \(n\),表示链的长度。
第二行包含 \(n\) 个整数,第 \(i\) 个整数表示 \(a_i\) 。

Output

输出一行一个整数表示对应的答案。

Note

对于所有测试数据,保证:\(1 ≤ t ≤ 5, 1 ≤ n ≤ 2 × 10^5, 1 ≤ a_i ≤ 10^9\) 。

分析

\(O(n\log n)\) 做法:

可以贪心地断开边,考虑优先断开全局最大值与次大值,对于二者中间的数优先和最大值断开。剩下两段递归地断开即可。用 \(ST\) 表维护区间最值,总复杂度 \(O(n\log n)\) 。

\(O(n)\) 线性做法:

%%%拜谢nkp
考虑在线,前面所有输入已经构造为最优解的情况下新加入的 \(a_i\) 对答案的贡献。分情况讨论:
•当 \(a_i>a_{i-1}\) 且 \(a_i\ge a_{max}\) 时,要总体贡献最小一定是让 \(a_i\) 与 \(a_{i-1}\) 断开时的贡献为 \(a_i\ - \ a_{max}\) ,并同时更新 \(a_{max}\) ;
•当 \(a_i>a_{i-1}\) 且 \(a_i<a_{max}\) 时,\(a_i\) 被包含在已构造最优贡献的值域中,一定存在一种调整构造的方法使新增的 \(a_i\) 贡献为 \(0\) ;
•当 \(a_i \le a_{i-1}\) 时,无论先前的 \(a_{min}\) 与 \(a_i\) 的关系如何, \(a_{min}\) 都已经被取整体最大值的操作覆盖而不会影响贡献,存在的最小贡献即 \(a_{i-1} \ -\ a_i\) ;
所以经过 \(n\) 次添加操作得到的就是最优贡献,时间复杂度达到非常优秀的 \(O(n)\) ;只需在输入同时记录 \(a_{i-1}\) 和更新 \(a_{max}\) ,空间复杂度仅为 \(O(1)\)。
惊为天人!nkp:其实复杂度瓶颈在输入

\(O(n)\) AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

inline int read() {
	int otto = 0;
	char a = getchar();
	while(!isdigit(a)) a = getchar();
	while(isdigit(a)) {
		otto = (otto << 1) + (otto << 3) + (a ^ 48);
		a = getchar();
	}
	return otto;
}

void solve() {
	int n = read(); ll ans = 0;
	int fst = read(), mx = fst, lst = fst;
	
	for(int i = 2; i <= n; i++) {
		int x = read();
		if(x <= lst) ans += abs(x - lst);
		else if(x >= mx) ans += x - mx, mx = x;
		lst = x;
	}
	
	printf("%lld\n", ans);
}

int main() {
	freopen("chain.in", "r", stdin);
	freopen("chain.out", "w", stdout);
	int c = read(), T = read();
	while(T--) solve();
}

标签:链链,chain,int,题解,最大值,max,复杂度,断开
From: https://www.cnblogs.com/Ydoc770/p/18493373

相关文章

  • P9751 [CSP-J 2023] 旅游巴士 题解
    思路首先,举一个例子,假如说小Z到了入口,但是没到时间,所以没法进去,该怎么办?当然是等$k$个时间单位呀.除此之外,像到了其他景区,但是还没开门怎么办?继续等$k$的非负整数倍时间呀.知道这个后,我们先定义状态$f_{i,j}$,表示到达点$i$时,路径长度(即时间)$mod$$k$的最早时......
  • P9749 [CSP-J 2023] 公路 题解
    此题贪心食用更佳在输入油价的时候,我们边计算油价的最小值和路程和.当路程之和$>0$时,计算油价并且减去对应路程即可.注意事项要开$long$$long$!!!.代码#include<iostream>#include<cstdio>#include<cmath>#include<cstring>usingnamespacestd;typedeflonglo......
  • P9750 [CSP-J 2023] 一元二次方程 题解
    大模拟此题大模拟即可,只需注意几点:分母$>0$.要给根式化简.分数要约分.求较大根,那就$b^2$加$\bigtriangleup$即可.分母>0因为求根公式中,分母中只有$a$一个未知数,所以我们只需保证$a>0$即可.所以,当$a<0$时,我们把$a,b,c$全部取相反值.但这也是......
  • 题解:P10949 四叶草魔杖
    2024/10/16更新:修改了状态的枚举方式,时间复杂度变为\(O(3^n)\)。题目传送门前言本篇题解默认您已熟练掌握最小生成树、状压dp及其应用,如果您还不会,请先阅读相关博客。分析我们要选出一条边,通过边转移能量,使得所有宝石的能量都为\(0\)。这看上去挺麻烦的,让我们挖掘一......
  • 题解:AT_joisc2019_k 合併 (Mergers)
    题目传送门前言联考题,被初一的我切了。看到题解区里没有Tarjan做法,于是来补一篇Tarjan题解。分析因为相同州的城市不会分裂,所以可以给相同州的成市连边(注意不是两两连边,连成一个环就行),发现把国家分成两个部分就相当于断掉一条道路。那么如果整个国家就是一个边双连通分量,......
  • 题解:P11207 「Cfz Round 9」Rose
    可以考虑把字符串\(s\),\(t\)按\(s_1t_1s_2t_2\dotss_nt_n\)拼接,记为\(a\)。为了方便表述,这里分别把PVW表示为012。Subtask0我会暴力!可以直接在\(a\)上进行dfs,复杂度为\(O(3^{2n})\)。Subtask1我会找性质!注意到答案只有可能是\(0,1,2\),因为在最坏情况下,只......
  • 题解:P11204 「Cfz Round 9」Lone
    首先可以观察出把木棍平均分是最优的。然后平均分后最多只有两种长度的木棒,长度分别为\(\lfloor\frac{m}{n}\rfloor\)和\(\lfloor\frac{m}{n}\rfloor+1\)。最后check一下就行了。代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#define......
  • P2934 [USACO09JAN] Safe Travel G 题解
    一个用平衡树,不用脑子的写法。(目前没有用平衡树的诶。)题意不经过最短路的最后一条边的最短路,保证最短路唯一。思路看到最短路唯一容易想到建出的最短路DAG其实是最短路树(以\(1\)为根)。那题意转化为求每个节点不经过与父亲的连边,所能到根节点的最短路。容易发现每个点的......
  • 【NOIP2021】方差 题解
    前言题目链接:洛谷;LOJ;UOJ。题意简述给你单调不降序列\(\{a_n\}\),你可以让\(a_i\getsa_{i-1}+a_{i+1}-a_i\),求操作后方差的最小值。\(n\leq10^4\),\(1\leqa_i\leq600\)。题目分析仔细观察操作,发现实际上是将\(a_i\)按照\(a_{i-1}\)和\(a_{i+1}\)的......
  • 题解:P10977 Cut the Sequence
    题目传送门分析看到这种题就可以想到动态规划,先设状态:$f_i$表示考虑前$i$个数,所需要的最小代价。发现$f_i$可以从所有$i$以前的状态加后一段区间转移过来,于是可以列出状态转移方程:$$f_i=\min_{j=i-1}^{s_i-s_j\leqm}(f_j+\max_{k=j+1}^i)$$其中$j$......