P4983忘情
今天挺开心的\(\sim\),省选加油\(!\)
\(P4893\)忘情
我能说今晚我才真正学会\(wqs\)和斜率优化吗\(?\)
恰好选几个,必然需要\(wqs\)二分一下
那么考虑不考虑次数情况下转移,\(dp[i]\)表示前\(i\)个分成若干段的最小代价,然后直接转移是\(O(n^2)\)
比较显然的可以写成斜率式
\(dp[j]-2\times sum[j]+sum[j]\times sum[j]=2\times sum[i]\times sum[j]+dp[i]-(sum[i]+1)^2\)
维护一个下凸包即可
#define Eternal_Battle ZXK
#include<bits/stdc++.h>
#define int long long
#define MAXN 100005
using namespace std;
int a[MAXN],sum[MAXN],dp[MAXN];
int sta[MAXN],num[MAXN];
int n,m,INF=LLONG_MAX;
int Y(int x)
{
return dp[x]-2*sum[x]+sum[x]*sum[x];
}
int X(int x)
{
return sum[x];
}
double slope(int x1,int x2)
{
return (double)(Y(x2)-Y(x1))/(X(x2)-X(x1));
}
bool check(int x)
{
int head,tail;
sta[head=tail=1]=0;
memset(num,0,sizeof(num));
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
while(head<tail&&slope(sta[head],sta[head+1])<2*sum[i]) head++;
dp[i]=dp[sta[head]]+(sum[i]-sum[sta[head]]+1)*(sum[i]-sum[sta[head]]+1)+x;
num[i]=num[sta[head]]+1;
while(head<tail&&slope(sta[tail-1],sta[tail])>slope(sta[tail],i)) tail--;
sta[++tail]=i;
}
return num[n]<=m;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
if(m==2)
{
int Ans=INF;
for(int i=0;i<=n;i++)
{
Ans=min(Ans,(sum[i]+1)*(sum[i]+1)+(sum[n]-sum[i]+1)*(sum[n]-sum[i]+1));
}
cout<<Ans<<"\n";
return 0;
}
memset(dp,0x3f,sizeof(dp));
int l=0,r=INF/2,mid,ans;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
//如果小于等于m
//那么就是减多了
r=mid-1;
ans=mid;
}
else l=mid+1;
}
// cout<<"Ans: "<<ans<<"\n";
check(ans);
cout<<dp[n]-m*ans<<"\n";
}
P4983忘情的更多相关文章
- 洛谷P4983 忘情 (WQS二分+斜率优化)
题目链接 忘情水二分模板题,最优解对划分段数的导数满足单调性(原函数凸性)即可使用此方法. 详细题解洛谷里面就有,不啰嗦了. 二分的临界点让人有点头大... #include<bits/stdc ...
- 决策单调性&wqs二分
其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- 高考集训讲课(To 高一)
高考集训讲课(To 高一) 主要是怕下午讲着讲着把自己讲懵了,有一定的迷糊概率 经过机房的讨论,一致认为插头\(DP\)实用性不大,所以这次不讲了,先把重要的讲一讲. 顺便吐槽一下,凭什么另外几个人都 ...
- Luogu4983 忘情
Luogu4983 忘情 定义序列 \(x_1,\ x_2,\ \cdots,\ x_n\) 的值为 \(\frac{((\displaystyle\sum_{k=1}^nx_k\times \bar ...
- 洛谷T51924 忘情
二分上界有多大开多大 二分上界有多大开多大 二分上界有多大开多大 重要的事情说三遍 又被bright神仙带着做题了 先无脑上wqs二分 我们可以把这个柿子画一下,区间的花费就变成((sigema(l~ ...
- B 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
最熟悉的陌生人 作者:张慧桥 枪与玫瑰 我看了一下聊天室的名单,哈哈哈,我不禁喜出望外:蝶恋花那丫头片子挂在线上呢,真是天助我也.初时的担心一扫而光,我精神抖擞地喝下一大口咖啡,猛抽了三口烟,现在的我 ...
- 详解Bootstrap面板组件
面板组件主要作用是用来处理一些其他组件无法完成的功能,在不同的版本中具有不同的源码: LESS:panels.less SASS:_panels.scss 基础面板非常简单,就是一个div容器中运用了 ...
- [ZZ] Cache
http://blog.sina.com.cn/s/blog_6472c4cc0102duzr.html 处理器微架构访问Cache的方法与访问主存储器有类似之处.主存储器使用地址编码方式,微架构可以 ...
随机推荐
- 893. Groups of Special-Equivalent Strings - LeetCode
Question 893. Groups of Special-Equivalent Strings Solution 题目大意: AB两个字符串相等的条件是:A中偶数位出现的字符与B中偶数位出现的字 ...
- unity---动画基础
旧动画系统 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Mo ...
- Redis 应用只 消息队列 简单实现(生产者 消费者模式)
运行效果:
- 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题
刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...
- Puppeteer学习笔记 (1)- 什么是Puppeteer
本文链接:https://www.cnblogs.com/hchengmx/p/11006263.html 1. phantomjs介绍 在介绍puppeteer之前必须介绍一下phantomjs,p ...
- flink窗口分类
窗口分类 按照驱动类型分类 窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息就是"怎样截取数据".换句话说,就是以什么标准来开发和结束数据的截取. 按照驱动类型分类主要 ...
- 【Redis】ziplist压缩列表
压缩列表 压缩列表是列表和哈希表的底层实现之一: 如果一个列表只有少量数据,并且数据类型是整数或者比较短的字符串,redis底层就会使用压缩列表实现. 如果一个哈希表只有少量键值对,并且每个键值对的键 ...
- java类的学习
什么是类: 类=属性+方法 属性来源于状态(以变量的形式存在):方法来源于动作: *属性对应的是数据,而数据只能存在变量中. 方法内的变量为局部变量:类体中的变量称为成员变量(也称为属性) java中 ...
- Linux基础命令、引号和括号的作用
查看硬件信息 查看 cpu lscpu命令可以查看cpu信息 cat /proc/cpuinfo也可看查看到 查看内存大小 free命令 cat /proc/meminfo 查看硬盘和分区 lsblk ...
- Node.js精进(6)——文件
文件系统是一种用于向用户提供底层数据访问的机制,同时也是一套实现了数据的存储.分级组织.访问和获取等操作的抽象数据类型. Node.js 中的fs模块就是对文件系统的封装,整合了一套标准 POSIX ...