#单调队列,动态规划,斜率优化#hdu 3507 Print Article

2024-02-11 06:08

本文主要是介绍#单调队列,动态规划,斜率优化#hdu 3507 Print Article,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

一篇文章在打印k个需花费
这里写图片描述
m是常数,问最少花费多少就可以打完一篇文章


分析

对于 x 1 &lt; x x1&lt;x x1<x and x 2 &lt; x x2&lt;x x2<x
可得 d p [ x ] = d p [ x 1 ] + ( s u m [ x ] − s u m [ x 1 − 1 ] ) 2 + m dp[x]=dp[x1]+(sum[x]-sum[x1-1])^2+m dp[x]=dp[x1]+(sum[x]sum[x11])2+m
d p [ x ] = d p [ x 2 ] + ( s u m [ x ] − s u m [ x 2 − 1 ] ) 2 + m dp[x]=dp[x2]+(sum[x]-sum[x2-1])^2+m dp[x]=dp[x2]+(sum[x]sum[x21])2+m
但是 O ( n 2 ) O(n^2) O(n2)会超时
x 1 &lt; x 2 x1&lt;x2 x1<x2 and d p ( x 1 ) &lt; d p ( x 2 ) dp(x1)&lt;dp(x2) dp(x1)<dp(x2)
变形可得
d p [ x 2 ] + s u m [ x 2 − 1 ] 2 − d p [ x 1 ] − s u m [ x 1 − 1 ] 2 2 ( s u m [ x 2 − 1 ] − s u m [ x 1 − 1 ] ) &lt; s u m [ x ] \dfrac{dp[x2]+sum[x2-1]^2-dp[x1]-sum[x1-1]^2}{2(sum[x2-1]-sum[x1-1])}&lt;sum[x] 2(sum[x21]sum[x11])dp[x2]+sum[x21]2dp[x1]sum[x11]2<sum[x]
这里写图片描述
所以如果ANSWER(BC)<=sum[x],证明B点劣于C点,可以去掉B点。否则ANSWER(BC)>sum[x],如果ANSWER(AB)>=ANSWER(BC),则有ANSWER(AB)>sum[x],证明A点优于B点,可去掉B点。所以单调队列维护下凸壳


代码

#include <cstdio>
using namespace std;
typedef unsigned long long ull;
int n,m,q[500001],head,tail; ull sum[500001],f[500001];
ull in(){ull ans=0; char c=getchar();while (c<48||c>57) c=getchar();while (c>47&&c<58) ans=ans*10+c-48,c=getchar();return ans;
}
ull print(ull ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
ull up(int i,int j){return f[i]+sum[i]*sum[i]-f[j]-sum[j]*sum[j];}//分子
ull down(int i,int j){return (sum[i]-sum[j])<<1;}//分母
ull dp(int i,int j){return f[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+m;}//dp的答案
int main(){while (scanf("%d%d",&n,&m)==2){f[0]=q[head=tail=1]=0;for (register int i=1;i<=n;i++){sum[i]=sum[i-1]+in();while (head<tail&&up(q[head+1],q[head])<=sum[i]*down(q[head+1],q[head])) head++;f[i]=dp(i,q[head]);while (head<tail&&up(i,q[tail])*down(q[tail],q[tail-1])<=up(q[tail],q[tail-1])*down(i,q[tail])) tail--;//答案更优q[++tail]=i;} print(f[n]); putchar('\n');}return 0;
}

这篇关于#单调队列,动态规划,斜率优化#hdu 3507 Print Article的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699010

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s