首页 > 其他分享 >题解 LGP2300【合并神犇】

题解 LGP2300【合并神犇】

时间:2023-07-25 15:15:12浏览次数:46  
标签:题解 sum 段数 debug 神犇 include 单调 LGP2300

Problem

随机 \(n\) 个正整数组成序列。将序列分尽量多的段数,使得前一段的和不大于后一段的和。求能分成多少段。输出 \(n-ans\)。\(n\leq 10^5\),值域不重要。

Solution

状态设计为:\(f_i=1+\min_{sum_i-sum_j\geq g_j}f_j\) 表示前 \(i\) 个数字划分的最多段数,\(g_j\) 定义为 \(f_i\) 的转移点 \(j\) 上的 \(sum_i-sum_j\) 也就是在这一次划分中。单调队列优化 DP 即可。

下面证明:

  1. \(f_i\) 单调不降,\(f_i-f_{i-1}\leq 1\)。
    至少存在一种方案,是将 \(i\) 并入到最后一次划分的块中。另外还可能 \(a_i\) 单独成块。

  2. 对于 \(i<j\),如果 \(f_i=f_j\),那么 \(g_i<g_j\)。
    错误证明:它们的决策点单调递增

  3. 我们总是找离 \(i\) 最近的合法的 \(j\),这样会使得 \(g_i\) 最小。

可以参考一下 https://www.luogu.com.cn/blog/484784/p2300-ge-bing-shen-post#

Code

暴力能过

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
int n;
LL sum[1<<18],f[1<<18],g[1<<18];
int main(){
//	#ifdef LOCAL
//	 	freopen("input.in","r",stdin);
//	#endif
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&sum[i]),sum[i]+=sum[i-1];
	for(int i=1;i<=n;i++){
		for(int j=i-1;j>=0;j--){
			if(sum[i]-sum[j]>=g[j]){
				f[i]=f[j]+1;
				g[i]=sum[i]-sum[j];
				break;
			}
		}
		debug("f[%d]=%d,g[%d]=%d\n",i,f[i],i,g[i]);
	}
	printf("%d\n",n-f[n]);
	return 0;
}

标签:题解,sum,段数,debug,神犇,include,单调,LGP2300
From: https://www.cnblogs.com/caijianhong/p/solution-p2300.html

相关文章

  • 洛谷P3629 [APIO2010] 巡逻题解
    题目链接P3629[APIO2010]巡逻-洛谷|计算机科学教育新生态(luogu.com.cn)思路n个村庄,n-1条道路,原图为树1.若k=0(不修建道路)那么答案为(n-1)*2 每个道路会走两遍2.若k为1(修建一条道路)设修建的道路(r1)所在的环长度为L那么答案为(n-1)*2-L+2可以看到r1所在环的道路只走了......
  • 题解 P1150 【Peter的烟】
    postedon2020-11-1410:00:20|under题解|source2023编者注:本篇题解的方法过于暴力,但是尊重历史。请不要太在意。—-教你们用栈做这道题原题传送门看到这题,第一反应是用stack做。我们可以把Peter手上的烟看作一个栈,一根烟就是一个元素,抽了\(n\)支烟就从栈里pop几个,......
  • 题解 P1008 【三连击】
    postedon2020-11-1217:25:10|under题解|source2023编者注:请尊重历史。本题正解是暴力枚举先引用我们老师的一句话:(无恶意)不会吧不会吧,不会还有人不会写三连击吧!废话不多说,开始解题:理解题目和做题思路P1008三连击题目链接:https://www.luogu.com.cn/problem/......
  • 题解 CF1501A 【Alexey and Train】
    postedon2021-03-1321:57:02|under题解|source简单模拟题,考验选手的读题能力和使用谷歌翻译的能力。先定义一个\(now=0\),我们最后算出来的结果为\(now\)。对于每个站(不包括第\(n\)站),我们需要加上\(3\)个部分:额外时间,now+=ex[i];第\(i-1\)站到第\(i\)站的时......
  • 题解 CF1501B 【Napoleon Cake】
    postedon2021-03-1617:42:06|under题解|source题目可以转化一下:给一个长为\(n\)的数组\(a\),请求出一个长为\(n\)的数组\(b\)。要求若\(a_i\)不为\(0\),则\([b_{i-a_i+1},b_i]\)这个区间要为\(1\)。知道这个题目意思就好办了。题目说\(n\leq2\times10^5\),......
  • 题解 CF1497C2 【k-LCM (hard version)】
    postedon2021-03-2009:09:40|under题解|source2023编者注:有一些链接点不进去,分别是cf1497c1的cf页面和https://www.cnblogs.com/caijianhong/p/Solution-cf1497c1.html此题与CF1497C1有异曲同工之妙。我们知道,\(\operatorname{lcm}(1,x)=x\),不难想到,\(\operato......
  • 题解 CF1497C1 【k-LCM (easy version)】
    postedon2021-03-2008:26:53|under题解|source看数据范围,\(1\leqT\leq10^4\),\(1\leqn\leq10^9\),显然是构造题。我们分三类讨论:\(n\bmod2=1\):显然可以先提出一个\(1\),再把\(n-1\)分成两半,\(\operatorname{lcm}(1,\frac{n-1}{2},\frac{n-1}{2})=\frac{n-1}{2}\le......
  • 题解 P7679 【[COCI2008-2009#5] JABUKA】
    postedon2021-07-0717:38:14|under题解|source设题目中分给每个朋友的苹果数为\(x\),显然有\(x\vertr\landx\vertg\),也就是\(x\vert\gcd(r,g)\)。我们都知道,如果\(a\timesb=c\),那\(a\)和\(b\)都是\(c\)的因数,也就是说因数都是成对出现的(注意特判完全平方......
  • 题解 P2229 【[HNOI2002]沙漠寻宝】
    postedon2021-06-0112:15:15|under题解|source这题一看就知道是个模拟。做模拟题的时候,一定要先确保你的程序能跑出正确的结果,再去想优化时间。这道题还是很简单的,让我们开始吧:读入我们把输入离线,拿string存起来。如果不离线,那loop就会很难处理,加大难度。intn;......
  • 题解 P2903 【[USACO08MAR]The Loathesome Hay Baler S】
    postedon2021-05-0320:50:49|under题解|source首先输入,记录一下哪个齿轮的位置在\((0,0)\),哪个在\((x_t,y_t)\)。接着,为了避免多次判断两个齿轮相切而超时,我们可以预处理一个\(link_{i,j}\),表示第\(i\)个齿轮是否和第\(j\)个齿轮相切。这部分直接\(O(n^2)\)暴......