`
darren_nizna
  • 浏览: 72758 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

[HDU][3045][Picnic Cows][斜率优化]

阅读更多
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define min(a,b) ( (a)< (b)? (a): (b) )
int n, m;
int const N= 400100;
typedef long long LL;

/*
dp[i]= min{ dp[j]+ sum[i]- sum[j]+ ( i- j )* data[j+ 1] }
要求分段的序列长度不小于 m,即 i- j+ 1>= m
 
假设 j> k, 要使决策 j 比决策 k 优, 则有
dp[j]+ sum[i]- sum[j]+ ( i- j )* data[j+ 1]<
dp[k]+ sum[i]- sum[k]+ ( i- k )* data[k+ 1]
整理有:
dp[j]- sum[j]- j* data[j+ 1]- ( dp[k]- sum[k]- k* data[k+ 1] )
< i* ( data[j+ 1]- data[k+ 1] )

所以 j 比 k 优等价于 
( dp[j]- dp[k]- sum[j]+ sum[k]- j* data[j+ 1]+ k* data[k+ 1] )/
( data[j+ 1]- data[k+ 1] )< i

今 F[j,k]= 上式左边
对于 k< j< i< t
假设 F[j, k]> F[i, j]
如果 F[i, j]< t 则 i 比 j 优
如果 F[i, j]> t 则 F[j, k]> t 得到 k 比 j 优
故对于满足条件 F[j,k]> F[i,j] 的可以剔除 j 状态

因为长度要不小于 2* m 故 1到 m- 1 都不可能成为决策点
对于 i, 能成为 i 状态的决策点的最小 j 为 i- m+ 1,并且对于
t> i, 这个最小 j= i- m+ 1 也有可能成为 t 的决策点 
故对于当前状态 i ( i- m+ 1>= m ) 将决策点 i- m+ 1 加入 
*/

LL dp[N], data[N], sum[N];
int que[N], head, tail;

inline LL S( int j, int k ){
	return data[j+ 1]- data[k+ 1];
}

inline LL G( int j, int k ){
	return  dp[j]- sum[j]+ j* data[j+ 1]-
	      ( dp[k]- sum[k]+ k* data[k+ 1] );
}

int main(){
	while( scanf("%d%d",&n,&m)!= EOF ){
		sum[0]= 0;
		for( int i= 1; i<= n; ++i )scanf("%I64d", data+ i );
		
		sort( data+ 1, data+ 1+ n );
		for( int i= 1; i<= n; ++i )sum[i]= sum[i-1]+ data[i];
		
		head= 0, tail= 0;
		que[++tail]= 0; dp[0]= 0;

		for( int i= m; i<= n; ++i ){
			while( head< tail  && S(que[head+ 1],que[head])* i>= G( que[head+ 1], que[head] ) )
			head++; 
			
			dp[i]= dp[ que[head] ]+ ( sum[i]-sum[que[head]] )- ( i- que[head] )* data[ que[head]+ 1 ];
			
			if( i- m+ 1>= m ) que[++tail]= i- m+ 1;
			int j= que[tail]; tail--;
			
			while( head< tail && G( que[tail], que[tail-1] )* S( j, que[tail] )>=
			                     G( j, que[tail] )* S( que[tail], que[tail-1] ) ) tail--;
			                     
		    que[++tail]= j;
		}
		
		printf("%I64d\n", dp[n] );
	}
	
	return 0;
}

 

分享到:
评论

相关推荐

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    hdu1250高精度加法

    ### hdu1250高精度加法 ...虽然题目提到的代码实现相对繁琐且效率不高,但通过理解其背后的逻辑,我们可以进一步优化代码结构,提高程序的执行效率。对于类似的大数运算问题,掌握高精度算法是非常重要的基础技能。

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    HDU DP动态规划

    动态规划通常用于优化多阶段决策过程,通过将问题分解为更小的子问题并存储子问题的解来避免重复计算,从而提高效率。 【描述】提到的"HDU的一题"可能是指HDU(杭州电子科技大学)在线判题系统中的一道动态规划题目...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    HDU1059的代码

    HDU1059的代码

    hdu1001解题报告

    hdu1001解题报告

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    杭电ACMhdu1163

    6. **复杂度分析**:了解时间复杂度和空间复杂度的概念,能够分析和优化代码的运行效率,这是ACM竞赛中的关键能力。 7. **IO处理**:学会标准输入输出(scanf/printf)和文件输入输出,以及快速读入大整数(如使用...

    HDU acm-PPT课件

    【ACM入门与提高:HDU ACM竞赛课程详解】 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)是一项全球性的竞赛,旨在激发大学生对计算机科学的兴趣,提升他们的...

    HDU.rar_hdu_hdu07_com_shownv9b_www.563hdu.

    4. **代码调试与优化**:由于有些代码可能不完整,这为学习者提供了实践调试和优化代码的机会,理解为何某些代码无法正确运行,以及如何改进它们。 5. **版本控制与文件管理**:在处理多个题目和不同版本的代码时,...

    Hdu1000—2169部分代码

    HDU是杭州电子科技大学(Hangzhou Dianzi University)举办的一个在线编程竞赛平台,全称为HDU Online Judge。ACM是国际大学生程序设计竞赛(International Collegiate Programming Contest)的缩写,是一个全球性的...

    HDU最全ac代码

    5. **优化技巧**:如何减少时间复杂度,使用位运算优化、循环展开、记忆化搜索等方法提升代码效率。 6. **调试和测试**:理解如何编写测试用例来检查代码的正确性,以及如何利用调试工具定位和修复错误。 7. **...

    hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084

    【标题】"hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084" 提供的是一个关于杭电(HDU)ACM竞赛第1084题的解决方案。该题目可能是在编程竞赛中常见的算法问题,而ACM(国际大学生程序设计竞赛)是全球知名的编程...

    hdu2101解决方案

    hdu2101AC代码

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    hdu 5007 Post Robot

    hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。

    hdu acm 教案(7)

    HDU ACM教案是针对ACM/ICPC(国际大学生程序设计竞赛)的训练教程,旨在帮助参赛者提升算法和编程技能。"搜索入门"这部分内容是教程中的一个重要章节,主要介绍在解决算法问题时如何有效地运用搜索策略。在这个章节...

Global site tag (gtag.js) - Google Analytics