https://scut.online/p/365

https://www.luogu.org/problemnew/solution/P2365

写这篇的时候还不是很明白,看一下这个东西。

https://www.cnblogs.com/CreeperLKF/p/9045491.html

还是不懂,去问学长了,叫做wqs二分。要求恰好选m个的这种题,每个物品放一个附加权值C。

https://blog.csdn.net/chenxiaoran666/article/details/83381779

既然原来选得越多越优,那么我们可以给选择一个物品增加一个代价C(C可以拿来二分),由于总贡献增长得越来越慢,所以最后肯定会形成一个单峰函数,然后我们就可以通过DP等方式 来求解出此时的最优答案以及最优答案选择的物品个数,并根据选择的物品个数来更新C的值。

是通过给分段附加一个比较大的权值,使得分段越多的不一定更优了,从而控制凸壳上的点的数量,但是这个控制的时候为什么是单调的呢?

胡大佬的标程

#include <bits/stdc++.h>
#define ll long long using namespace std; const int MAXN = 300010;
ll dp[MAXN], a[MAXN], n, m, cnt[MAXN], que[MAXN]; ll X(int i, int j) {
return a[j + 1] - a[i + 1];
} ll Y(int i, int j) {
return (dp[j] + a[j + 1] * a[j + 1]) - (dp[i] + a[i + 1] * a[i + 1]);
} ll DP(int i, int j) {
return dp[j] + (a[i] - a[j + 1]) * (a[i] - a[j + 1]);
} ll solve(ll C) {
dp[0] = 0;
cnt[0] = 0;
int s = 0, t = 0;
que[++t] = 0;
for(int i = 1; i <= n; i++) {
while(s + 1 < t && Y(que[s + 1], que[s + 2]) < 2LL * a[i] * X(que[s + 1], que[s + 2]))
s++;
dp[i] = DP(i, que[s + 1]) + C;
cnt[i] = cnt[que[s + 1]] + 1;
while(s + 1 < t && 1LL * Y(que[t], i) * X(que[t - 1], que[t]) <= 1LL * Y(que[t - 1], que[t]) * X(que[t], i))
t--;
que[++t] = i;
}
return cnt[n];
} int main() {
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
sort(a + 1, a + 1 + n);
ll l = 0, r = 1e12;
while(l < r) {
int mid = (l + r) >> 1;
int tmp = solve(mid);
if(tmp <= m)
r = mid;
else
l = mid + 1;
}
solve(r);
printf("%lld\n", dp[n] - m * r);
}

最新文章

  1. C# 使用AForge调用笔记本摄像头拍照
  2. Java 代码完成删除文件、文件夹操作
  3. 使用ajax技术实现txt弹出在页面上
  4. cocoaPod的使用
  5. yii2嵌入微信公众号支付
  6. convert2Mp4 code snippet
  7. CSS3 照片墙
  8. 部署到Linux使用VS Code 开发.NET Core 应用程序
  9. Python3基础 使用 in notin 查询一个字符是否指定字典的键或者值
  10. dubbo 入门
  11. React笔记:组件(3)
  12. Python_queue单项队列
  13. ESP8266开发综合篇第十四节(LUA)-8266作为TCP服务器,Android客户端连接,显示温湿度,控制继电器
  14. AD软件原理图封装过程(即由原理图转换到PCB)
  15. Javascript短路运算||和&amp;&amp;
  16. 原生 js 时钟实现
  17. win764位下mysql-5.6.24-x64从安装到登录成功
  18. Metasploit拿Shell
  19. 软工实践l练习一一利用github托管项目
  20. 【学习笔记】BEST定理

热门文章

  1. vue-element添加修改密码弹窗
  2. Laya 爆改Laya IDE和Laya引擎使其支持2D粒子爆发模式
  3. python 获取list某个元素下标
  4. 电脑新安装JDK版本并运行使用该JDK版本问题
  5. 3D Computer Grapihcs Using OpenGL - 05 EBO
  6. sqlserver高版本往低版本迁移
  7. MacOS上zsh环境设置默认jdk
  8. React Native商城项目实战08 - 设置“More”界面cell
  9. hypermesh中怎么设置支反力(反作用力)
  10. 网络处理器(Network Processor)