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);
}

SCUT - 365 - 鹏哥的数字集合 - wqs二分 - 斜率优化dp的更多相关文章

  1. Gym - 101981B Tournament (WQS二分+单调性优化dp)

    题意:x轴上有n个人,让你放置m个集合点,使得每个人往离他最近的集合点走,所有人走的距离和最短. 把距离视为花费,设$dp[i][k]$表示前i个人分成k段的最小花费,则有递推式$dp[i][k]=m ...

  2. P4983-忘情【wqs二分,斜率优化】

    正题 题目链接:https://www.luogu.com.cn/problem/P4983 题目大意 给出长度为\(n\)的序列\(x\),记平均数为\(\bar{x}\),要求将序列分成\(m\) ...

  3. 洛谷P4983 忘情 (WQS二分+斜率优化)

    题目链接 忘情水二分模板题,最优解对划分段数的导数满足单调性(原函数凸性)即可使用此方法. 详细题解洛谷里面就有,不啰嗦了. 二分的临界点让人有点头大... #include<bits/stdc ...

  4. 决策单调性&wqs二分

    其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...

  5. wqs二分

    今天模拟赛有一道林克卡特树,完全没有思路 赛后想了一想,不就是求\(k+1\)条不相交的链,使其权值之和最大嘛,傻了. 有一个最裸的\(DP\),设\(f[i][j][k]\)表示在以\(i\)为根的 ...

  6. For循环将将数字集合分类写入字典

    有以下数字集合[11,22,33,44,55,66,77,88,99,25,35,45,66,88],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中.即{'k1' ...

  7. C#,判断数字集合是否是连续的

    /// <summary> /// 判断数字集合是否是连续的 /// </summary> /// <returns></returns> public ...

  8. SCUT - 289 - 小O的数字 - 数位dp

    https://scut.online/p/289 一个水到飞起的模板数位dp. #include<bits/stdc++.h> using namespace std; typedef ...

  9. Codeforces Round #365 (Div. 2) C - Chris and Road 二分找切点

    // Codeforces Round #365 (Div. 2) // C - Chris and Road 二分找切点 // 题意:给你一个凸边行,凸边行有个初始的速度往左走,人有最大速度,可以停 ...

随机推荐

  1. HDU-6278-Jsut$h$-index(主席树)

    链接: https://vjudge.net/problem/HDU-6278 题意: The h-index of an author is the largest h where he has a ...

  2. ie下,首页打开页面非常慢

    手里的项目,登录页面在IE下首次进入页面非常的慢,应该不只是登录页面,因为项目我也是半路接手的.开始以为是js的问题,后台把所有的代码都去掉,就一个空白的页面,然后慢慢的试试,最后才发现是一个CSS文 ...

  3. 自动配置/切换/查看JDK环境变量

    最近老是需要几个版本的JDK切换工作,于是网上收集资料整理,自己写了一个:自动配置/切换/查看JDK环境变量的批处理脚本.顺带3个JDK版本分别是:jdk1.6.0_43,jdk1.7.0_80,jd ...

  4. SQL server 统计分组经计

    SUM(A.AREA) OVER ( PARTITION BY A.ItemNo, A.PARTS ,A.WIDTH,A.HEIGHT) allotQty, SUM(A.SL) OVER ( PART ...

  5. WWW基本概念

    1.Internet 2.Intranet 3.万维网 注:万维网不等同于因特网,它只是因特网的一项服务. 4.TCP/IP 5.HTTP 注:HTTP是运行在应用层的一项服务. 注:服务器在没有用户 ...

  6. [USACO08FEB]连线游戏Game of Lines

    题目背景 Farmer John最近发明了一个游戏,来考验自命不凡的贝茜. 题目描述 Farmer John has challenged Bessie to the following game: ...

  7. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  8. CG-CTF | Hello,RE!

    菜狗开始向着pwn与re进军了(●'◡'●)[说白了,还是在水博客吧] 按r出flag: galf    leW{    emoc    _oT_    W_ER  dlro   }! 反一下:fla ...

  9. [CSP-S模拟测试]:毛二琛(DP)

    题目描述 $MYC$在$NOI2018$中,遇到了$day1T2$这样一个题,题目是让你求有多少“好”的排列.$MYC$此题没有获得高分,感到非常惭愧,于是回去专心研究排列了.如今数排列的题对$MYC ...

  10. Linux下修改mysql root密码

    1.修改MySQL的配置文件(默认为/etc/my.cnf),在[mysqld]下添加一行skip-grant-tables 2.保存配置文件后,重启MySQL服务 service mysqld re ...