wqs二分学习笔记

news/2025/10/13 10:22:54/文章来源:https://www.cnblogs.com/high-sky/p/19137884

一般解决问题

你有一个 \(k\),表示最后要变成 \(k\) 个,或者说是选 \(k\)

形式化地讲,设 \(f(i)\) 表示最后变成 \(i\) 个,或者是选 \(i\) 个的方案。

你一般要求的是 \(f(k)\) 的最大值或者最小值。

问题特征

你最后的 \((x,f(x))\) 是一个凸包。

而凸性意味着:如果我们给每个被选的物品增加一个相同的额外代价/收益 \(\lambda\)(称为惩罚或奖励),那么最优解中选择的物品数量 \(g(\lambda)\) 会随着 \(\lambda\) 单调变化。

为什么,这就是他的原理。

首先我们有一个凸包,然后二分它的斜率,然后就相当于平移这个直线使它的截距最大或者最小,很明显与一个点相切。

求出这个点之后可以根据 \(x\) 继续二分,因为我们求的是 \(x=k\) 的情况。

这个点为 \((x,f(x))\),那么如果我让他每次选惩罚 \(\lambda\),那么它的值就为 \(0\) 了,但是在其它的点上面,惩罚过后都是 \(\leq 0\) 的,那么我当前这个就是要找的截距最大。

于是,我们把每个 \(-\lambda\) 放进去,那么我们所求的最大的(一般用 \(dp\))便是我们要找的 \(x\),基于此二分即可。

细节

这里需要考虑一些边界情况,wqs 二分两个极端是要么只要 \(1/0\) 个,要么全都要,依据这个就行了。

而且,你还需要考虑优化的 \(dp\)\(x\) 的坐标一定要准确。

怎么判断是不是凸包呢?一种可用的方法是代价是凸函数,那么最后就是凸包,或者你可以求导解决。

例题

P4983 忘情

很好玩的题目。

题目概述

把长度为 \(n\) 的序列分成 \(k\) 个部分,每个部分的代价为 \((1+\sum_i a_i)^2\),那么最小的代价是多少呢?

分析

我们来思考一下。

我们注意到(\(\text{attention is all you need}\)),这个代价是单调的,也是凸的,所以可以用 wqs 二分解决。

最后我们求每一个少 \(\lambda\)\(dp\),显然是斜率优化即可。

代码

时间复杂度 \(\mathcal{O}(n\log V)\) 的。

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#include <cstring>
#include <vector>
#define int long long
#define N 100005
#define sqr(x) (x) * (x)
using namespace std;
int n,m,f[N],a[N],q[N],sum[N],g[N];
double X(int id) {return sum[id];
}
double Y(int id) {return f[id] + sum[id] * sum[id] - 2 * sum[id];
}
double Slope(int fir,int sec) {return (Y(fir) - Y(sec)) / (X(fir) - X(sec));
}
void check(int mid) {memset(f,0x3f,sizeof f),memset(g,0,sizeof g);f[0] = 0;int head = 1,tail = 0;q[++tail] = 0;for (int i = 1;i <= n;i ++) {while(head < tail && Slope(q[head],q[head + 1]) < 2 * sum[i]) head ++;f[i] = f[q[head]] + sqr(sum[i] - sum[q[head]] + 1) + mid;g[i] = g[q[head]] + 1;while(head < tail && Slope(q[tail - 1],q[tail]) > Slope(q[tail],i)) tail --;q[++tail] = i;}
}
signed main(){cin >> n >> m;for (int i = 1;i <= n;i ++) {scanf("%lld",&a[i]);sum[i] = sum[i - 1] + a[i];}int l = 0,r = 1e18,res = 0;while (l <= r) {int mid = l + r >> 1;check(mid);if (g[n] <= m) r = mid - 1,res = mid;//x坐标不在要求的右边,那么我们求的x坐标要尽量靠左,因为如果你算的尽量靠右的话,有可能会被判掉else l = mid + 1;}check(res);cout << f[n] - m * res;return 0;
}

P2619 [国家集训队] Tree I

题目概述

给你一个带权无向连通图(有白边和黑边),恰好用 \(k\) 条白边的最小生成树。

分析

你可以通过打表或者怎么发现:一开始我限制了 \(\leq i\) 条白边,那么对于原本的最小生成树的白边数量 \(p\),如果 \(i\leq p\),那么单调下降,因为有些白边原本就可以替代一些黑边;如果 \(i> p\),那么单调上升,因为有些更优的黑边被你的白边给替代了。

于是我们就能通过此题了。

代码

时间复杂度 \(\mathcal{O}(n\log n\log V)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 100005
using namespace std;
int n,m,k;
struct node{int u,v,w,col;
}a[N],b[N];
int fa[N];
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int tj,ans;
void check(int mid) {tj = 0;ans = 0;for (int i = 1;i <= m;i ++) b[i] = a[i];for (int i = 1;i <= m;i ++)if (b[i].col == 0) b[i].w += mid;//更难被选到stable_sort(b + 1,b + 1 + m,[](node x,node y) {if (x.w == y.w) return x.col > y.col;//尽量少用return x.w < y.w;});for (int i = 1;i <= n;i ++) fa[i] = i;for (int i = 1;i <= m;i ++) {int x = b[i].u,y = b[i].v;int xx = find(x),yy = find(y);if (xx != yy) fa[xx] = fa[yy],tj += (b[i].col == 0),ans += b[i].w;}
}
signed main(){cin >> n >> m >> k;int cnt = 0;for (int i = 1;i <= m;i ++) {int u,v,col,w;scanf("%lld%lld%lld%lld",&u,&v,&w,&col);a[i] = {u + 1,v + 1,w,col};cnt += (col == 0);}// for (int i = 0;i <= cnt;i ++) {//     for (int j = 1;j <= n;j ++) fa[j] = j;//     int choose = 0,ans = 0;//     for (int j = 1;j <= m;j ++) {//         int x = a[i].u,y = a[i].v;//         int xx = find(x),yy = find(y);//         if (xx != yy) {//             if ((a[i].col == 0 && choose < i) || a[i].col == 1) fa[xx] = fa[yy],cnt += a[i].col == 0,ans += a[i].w;//         }//     }//     printf("%lld %lld\n",i,ans);// }// 从小到大,能用就用白的,但是不能超过限制,所以说前面的代价都是单调下降,到了极点,也就是原本最小生成树的白边个数后,它不得不用更大的白边去替换小的黑边,所以单调上升这是一个凸函数int l = -1e18,r = 1e18,res = -1e18;while(l <= r) {int mid = l + r >> 1;check(mid);if (tj <= k) r = mid - 1,res = mid;else l = mid + 1; }// cout << res << '\n';check(res);cout << ans - k * res;return 0;
}

先暂时更新到这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android系统中使用initrc脚本在开机时禁用selinux

正常情况下设置selinux为宽容模式时,需要在adb shell 中执行setenforce 0的操作临时禁用selinux。 (当然,手机上有专门的magisk模块/app可以禁用,此处只是对userdebug/eng版本的系统提供的禁用方法) 为了避免每次…

2025年10月氧化镁厂家最新推荐排行榜,轻烧氧化镁,重烧氧化镁,高纯氧化镁,活性氧化镁公司推荐!

2025年10月氧化镁厂家最新推荐排行榜:轻烧氧化镁、重烧氧化镁、高纯氧化镁、活性氧化镁公司推荐随着工业技术的不断发展,氧化镁在多个领域中的应用越来越广泛。无论是轻烧氧化镁、重烧氧化镁、高纯氧化镁还是活性氧化…

Vector向量数据库对比

Vector向量数据库对比简介 向量数据库已成为存储和索引非结构化与结构化数据表征的首选工具。这些表征被称为向量嵌入(vector embeddings),由嵌入模型生成。向量存储在使用深度学习模型(尤其是大语言模型)开…

2025 年最新推荐集装箱拖车供应厂家权威榜单:全方位解析优质企业实力,助力精准选择箱式 / 冷藏等拖车服务

在集装箱运输行业快速发展的过程中,市场乱象逐渐凸显,给企业和货主的运输需求带来诸多困扰。众多集装箱拖车供应厂家资质良莠不齐,部分厂家缺乏规范管理,服务质量难以保障;运输安全隐患频发,不少厂家未配备完善的…

2025 年试验箱厂家最新推荐排行榜:聚焦高低温 / 恒温恒湿 / 冷热冲击等设备研发实力与 ISO 质量管控的标杆企业精选

当前工业制造、航空航天、电子通讯等领域对环境试验设备需求激增,试验箱作为检测产品性能稳定性的核心设备,其质量与技术水平直接影响下游企业研发效率与产品质量。然而市场上试验箱企业数量繁杂,部分企业存在技术创…

完整教程:PyTorch深度学习实战【12】之基于RNN的自然语言处理入门

完整教程:PyTorch深度学习实战【12】之基于RNN的自然语言处理入门pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

IDA9.0中文版与相关插件安装详细教程

一、安装IDA9.0中文版前提是需要安装插件中的 python包:python-3.11.9-amd64.exe然后再安装IDA Professional 9.0中文版二、IDA插件安装1.IDA Feeds插件安装进入idalib目录,然后使用以下命令进行安装:pip install …

深入解析:用AI重塑电商,京东零售发布电商创新AI架构体系Oxygen

深入解析:用AI重塑电商,京东零售发布电商创新AI架构体系Oxygenpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025 北京宽带安装公司最新推荐榜:专业口碑双优服务商汇总,企业家庭装机必看指南北京企业/北京无线/北京商务/北京商业/北京店铺宽带安装公司推荐

随着北京数字经济加速发展,企业云办公、家庭高清娱乐等需求对宽带服务的稳定性、响应速度提出更高要求。但当前市场仍存诸多痛点:部分服务商安装响应滞后,老旧小区与远郊区域服务覆盖不足;隐性收费、技术能力参差不…

2025年10月苹果仓源头厂家最新推荐榜单:专业仓储与高效配送的优质选择!

2025年10月苹果仓源头厂家最新推荐榜单:专业仓储与高效配送的优质选择!随着电子商务和供应链管理的不断发展,高效的仓储和配送解决方案成为企业成功的关键因素之一。苹果仓作为一种先进的仓储解决方案,不仅能够提升…

2025年10月整平机厂家最新推荐排行榜,精密整平机,自动整平机,金属板材整平机公司推荐!

2025年10月整平机厂家最新推荐排行榜:精密整平机、自动整平机、金属板材整平机公司推荐随着工业自动化和智能制造的快速发展,整平机作为金属加工领域的重要设备,其市场需求持续增长。为了帮助筛选整平机品牌,特此发…

2025 最新铝型材源头厂家推荐排行榜:优选企业深度解析,佛山龙头与新锐品牌选购指南

随着建筑、工业、家居等领域对铝型材需求的持续攀升,市场上厂家数量激增,但行业乱象却日益凸显:部分厂家产能不足导致订单交付延迟,原材料以次充好造成产品精度不达标,定制服务缺失难以匹配个性化需求,多层分销更…

linux与window文件互传方式

linux与window文件互传方式1、scp命令上传: window打开dos命令,scp 文件路径 linux用户名@ip地址:/路径下载: window打开dos窗口,scp linux用户名@ip地址:文件路径 需要下载到window路径2、sftp命令上传:sft…

行业推荐:广州智建云工程管理软件/软件系统/软件App/软件平台/工程管理软件和验房系统公司获认可,专业方案成品质管控优选

在工程管理数字化浪潮下,广州智建云信息技术有限公司打造的工程管理与验房一体化平台,凭借专业的功能设计与成熟的行业应用,成为众多企业的合规选择。其覆盖项目全周期的信息化解决方案,在提升管控效率与交付品质方…

2025 聚合氯化铝厂家最新推荐榜:优质厂家选购指南与高口碑品牌全解析聚合氯化铝絮凝剂/水处理用聚合氯化铝/生产聚合氯化铝厂家推荐

随着环保政策深化与水处理需求升级,聚合氯化铝市场迎来产能年均 5% 以上的增长,但行业乱象仍困扰采购者。部分产品有效成分不足、杂质超标导致二次污染,老牌与新兴品牌混杂让选型陷入困境,且饮用水净化、工业废水处…

Java 集合框架详解

Java 集合框架详解Java 集合框架(Collection Framework)是 Java 语言中处理对象集合的核心 API,位于 java.util 包下。它提供了统一的接口规范和丰富的实现类,用于存储、操作和管理一组对象,解决了数组长度固定、…

2025 年最新推荐!防水堵漏工程公司权威榜单重磅发布,覆盖地下室 / 污水池 / 伸缩缝等场景,帮业主避开乱象选靠谱企业

当前建筑行业中,防水堵漏工程对建筑安全与使用寿命至关重要,可行业乱象频发,部分施工单位无专业资质、技术落后,导致业主面临 “反复堵漏、反复渗漏” 困境,耗费成本还可能引发结构损坏。且行业服务标准不统一、售…

2025 年最新留学机构权威最新推荐排行榜,深度解析顶尖机构服务特色与核心优势助力留学规划英国/澳洲/香港/美国/加拿大留学机构推荐

随着留学需求不断攀升,2024 年中国出国留学人数突破 80 万,2025 年预计将持续增长。但留学市场中,机构资质参差不齐、服务质量良莠不齐的问题愈发凸显,不少学生和家长因选错机构遭遇申请延误、信息误导等问题,不仅…

2025 药包材辅导公司最新推荐榜:含 GMP 验证 / 质量管理体系 / 实验室装修等服务优质机构盘点公司推荐

随着医药行业监管政策持续收紧,药包材生产企业面临 GMP 合规、设备验证、实验室建设等多重挑战,合规成本与技术门槛显著提升。多数中小型企业因缺乏对 YBB 标准、欧盟 GMP 等法规的深度解读能力,常陷入申报材料反复…

Except 脚本免密登录(带参数调用except脚本)

Except 脚本免密登录(带参数调用except脚本)脚本名称:expect user_login.exp 脚本内容: #!/usr/bin/expectset ip [lindex $argv 0]set username [lindex $argv 1]set password [lindex $argv 2]set command [lind…