ABC 289 G - Shopping in AtCoder store 数学推导+凸包

凸包入门知识 平面凸包 :  定义:对一个简单多边形来说,如果给定其边界上或内部的任意两个点,连接这两个点的线段上的所有点都被包含在该多边形的边界上或内部的话,则该多边形为凸多边形 。 在解决平面凸包下面介绍了两种算法: 一、  Graham扫描法,运行时间为O(nlgn)。 二、  Jarvis步进法,运行时间为O(nh),h为凸包中的顶点数。 Graham扫描法    基本思想: 阅读详情

大意:
n个顾客,每个人有一个购买的欲望bi,m件物品,每一件物品有一个价值ci,每一个顾客会买商品当且仅当bi+ci>=定价.

现在要求对每一个商品定价,求出它的最大销售值(数量*定价)

n,m<=2e5

思路:

首先m件物品都是相互独立的,可以看成m个询问

另外,不妨对n个人的购买力做一个降序排序,显然它们满足单调性

不难发现,一旦我们定下了物品的价格,那么最终的销售额就由销售数量决定,也就是会有多少人买。此时在销售数量减少的情况下,我们一定会尽可能地抬高价格。从而我们得到一个结论:每一个商品i的定价一定是bj+ci(1<=j<=n).这是因为,它刚好可以使某个人会买这件商品。假设最优定价不满足这个结论,显然我们可以直接抬高它使其达到另一个bj+ci,此时我们在购买人数不变的情况下就提高了单价,这是更优的。

现在商品单价就只有n个选择了,对于商品i,我们的销售额就是max{j*(bj+ci)}(1<=j<=n),因为我们是按购买力降序排序,如果第j个人刚好买的起,那么前面的人一定都买的起(这里也不用关心购买力重复的问题,因为重复的话,后面相同购买力的的人对应的决策一定会更好)。

此时我们就转化了题意:对于一个i(1<=i<=m),找到max{j*(bj+ci)}


继续

 如果放到坐标系下来看的话(遇到双变量时,放到坐标系下往往是个不错的选择),我们令横坐标为ci(选择i也是可以的,因为i跟ci是一一对应的,但是考虑到我们是在对不同的价值做取舍,取ci会更加方便一点),纵坐标为对应的价值 , 也就是 j*(bj+ci),不同j的选择对应不同的总价值。

我们将ci表示成x,那么原本要求的值 max{j*(bj+ci)}(1<=j<=n) 转化为max{j*(bj+x)}=max{jx+j*bj},可以发现里面是一条直线的表达式。显然我们最后是要找一个这些直线在每一个横坐标下对应的最大值,也就是转化成了一个凸包。最后的答案就是横坐标对应的凸包上的点的纵坐标了

这里借一下官方题解的图片:

求凸包的话,我们从1-n开始遍历的话,直线的斜率是单调递增的,

 不妨用单调栈来更新当前段的最大值对应的直线

假设当前栈内有两条直线L0,L1,交点为X_01,那么对于新加入的直线L',如果它与L0的交点X_1'的横坐标小于X_01的横坐标,显然就可以把L1淘汰掉了,因为它后面也不会有比L‘更大的机会了。

关于这个判断,就只要计算一下交点横坐标就可以了。

最后我们得到了一个凸包,那么对于一个ci,我们去二分找到它在那一段线段上就可以了

时间复杂度O(n+mlogn)

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define mk make_pair
const ll N=2e5+10;
ll n,m;
ll b[N];
ll c[N];
struct P
{
	double x,y;
};
vector<pair<double,P>> vt;
double cross(P p1,P p2,P p3) {
    return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
}
bool judge(ll x,ll tar)
{
	return vt[x].first<=tar;
}
void solve()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>b[i];
	sort(b+1,b+1+n,greater<ll>());
	for(int i=1;i<=m;++i) cin>>c[i];
	
	for(int i=1;i<=n;++i)
	{
		P p={(double)i,(double)i*b[i]};//y=ix+i*b[i]
        //上文说过直线可以用jx+j*b[j],所以我们就直接用两个参数来表示对应的直线,可以说p就代表一条直线
		while(vt.size()>=2&&cross(p,vt.rbegin()->second,(next(vt.rbegin()))->second)<0) vt.pop_back();
//cross函数是在计算新加入的直线是否要把里面这一条直线弹出,也就是在计算交点横坐标是否满足条件。这个可以自己推一下
		//弹出无用的直线
		double x=0;
		if(vt.size())
		{
			P pp=vt.back().second;
			x=(pp.y-p.y)/(p.x-pp.x);
		} 
		vt.push_back(make_pair(x,p));
	}	
	ll len=vt.size();
//	for(auto i:vt)
//	{
//		cout<<i.second.x<<" "<<i.second.y<<endl;
//	}
	for(int i=1;i<=m;++i)
	{
		ll l=0,r=len-1;
		while(l<=r)
		{
			ll mid=l+r>>1;
			if(judge(mid,c[i])) l=mid+1;
			else r=mid-1;
		}
		P op=vt[l-1].second;
		cout<<(ll)(op.x*c[i]+op.y)<<" ";
	}
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//	ll t;cin>>t;while(t--)
	solve();
	return 0;
}

第一届“龙信杯”电子数据取证竞赛Writeup 阅读详情

相关推荐

深入理解DQN中的Q值:核心概念和应用

在强化学习中,Q值(或称为动作价值函数)是核心概念之一。Q值函数 ( Q(s, a) ) 表示在给定状态 ( s ) 下,采取动作 ( a ) 并遵循某策略后,智能体从当前状态到未来状态所能获得的预期总回报。简言之,Q值是评估特定状态和动作对的好坏的指标。

qlkaicx的博客 2975

凸包详细解析及模板

http://blog.youkuaiyun.com/yangkunpengd/article/details/51336453

s_h_w_s_n_g的博客 349

GD32F303 ADC+DMA实战:用硬件过采样搞定多通道数据采集(附完整代码)

本文详细介绍了GD32F303系列MCU通过ADC+DMA结合硬件过采样技术实现多通道数据采集的实战方案。从硬件设计要点到软件配置全解析,包括时钟树配置、ADC模块初始化和DMA传输设置,提供了完整的代码示例和优化技巧,帮助工程师构建高精度、低功耗的数据采集系统。

weixin_30466039的博客 319

Atcoder abc289题解

这道题目呢其实是一道easy的图论题, 题目的意思是给你一个序列。,让你求有多少种方案是的你选定的集合中所有的元素满足。放入动态数组里面,最后逆序输出就这样.有一个符号"レ"其实也就是图里的第。然后看到题目数据范围时就可以断定。,题目的大意是说有一个字符串。那么可以直接穷举,边改边输出.本题的主要意思是给定一堆集合。这道题 没什么好说的。

weixin_48321850的博客 891

【10. Wi-Fi 通用模组-小米 IoT 平台-如何进行硬件调试】

调试APP功能:从米家服务器缓存读取设备状态,等同于米家APP 的环境,开发者使用该调试器可模拟用户使用设备的实际情况,即调试米家 App 中的扩展程序。- 调试固件:调试器从固件读取设备状态,用于调试设备模组固件的某个单项功能,开发者使用该调试器可针对性地调试设备的某个功能。小爱语控测试工具:如果当前产品可被小爱语控,则可以使用该工具调试语控效果。调试APP功能(云端缓存)

tuoyuanO的博客 1041

Star CCM+ 202206 (17.04) 详细安装步骤

StarCCM+ 17.04 安装包和详细安装步骤

薛定谔的alpha狗 3万+

凸包计算:从原理到C++实现详解

本文介绍了计算点集凸包的安德鲁单调链算法及其C++实现。该算法通过两次扫描(从左到右和从右到左)构建凸包上下边界,核心是利用叉积判断点的相对位置来维护凸性。文章详细解析了算法步骤,包括预处理排序、去重处理、凸包构建主逻辑,以及面积计算和点包含检测等辅助功能。C++实现中运用了STL算法优化性能,并通过边界条件处理确保算法鲁棒性。该算法在碰撞检测、路径规划等领域有广泛应用,时间复杂度为O(nlogn)。

C++方向学习笔记 1310

备战2025数学建模国赛(算法46):多目标优化

本篇博客将深入浅出地介绍多目标优化的核心概念、主流算法,并重点结合一个数学建模竞赛的经典案例,提供完整的Python代码实现,助你在未来的竞赛中游刃有余。它通过寻找帕累托最优解集,完美地诠释了“鱼与熊掌不可兼得”的权衡思想,为最终决策提供科学依据。这些问题都包含多个相互冲突的目标,传统的单目标优化方法(如梯度下降、单纯形法)对此无能为力,因为它们无法同时优化多个目标。在数学建模竞赛中,我们面临的绝大多数问题都不是单一的“最好”,而是充满权衡与妥协的“最优”。记住,成功的建模不仅在于解出问题,更在于清晰地。

YOLO 285

#4847. 凸包的价值

题目描述 宫水三叶擅长手工,比如用绳子围住一个带钉子的木板。 这是一个很大的木板,我们可以用一个平面直角坐标系来描述它。 木板上面有 nnn 个钉子,第 iii 个钉子的坐标为 (xi,yi)(x_i,y_i)(xi​,yi​) 。 三叶可以用一些绳子连接一些点,这些绳子连接的点有一个限制。 首先,这些绳子连成的图形必须要是一个封闭的凸多边形。其次,绳子可能经过除端点外的其它点,但是没有两条绳子在同一条直线上。形象化的说,这是一个凸包,使用的绳子数就是边数。 对于一个图形,我们可以把所有钉子分成三类。 1、

Johnny817的博客 361

实战:RK3568 Android14 点亮 LVDS 屏幕

4组数据 (D0~D3) + 1组时钟 (CLK)。最大支持 1280x800 @ 60Hz。8组数据 (Even03, Odd03) + 2组时钟。支持 1080P 及以上。/ {/* 背光与电源 *//** 关键配置:数据格式映射* 可选值: "jeida-18", "jeida-24", "vesa-24"* 6位屏选 xx-18, 8位屏选 xx-24* 颜色不对(偏色/底片效果)就换 VESA <-> JEIDA*/

qq_33427070的博客 1165

VR大空间开发前期,设备选项与流程

欢迎开发者加入 VR 大空间开发之旅!本系列教程将以 Pico 和 HTC 设备为核心,系统拆解从基础搭建到功能实现的全流程,助你快速掌握开发要点。本系列共 12 篇,专为有编程基础但缺乏大空间开发经验的开发者设计。前 7 篇针对 Pico 和 HTC 设备差异分别讲解,后续步骤通用。核心目录如下:​1. 空间环境要求 - 灯光设置 - 场地面积规划 - 识别图案设计2. 网络部署方案3. 客户端体验模式解析 - 一体机模式 - 云渲染模式 - 背包体验模式4. Pico空间录制方法

unitygroup的博客 1354

二维凸包算法学习笔记

开始补一些算几的东西。 定义引入 凸包到底是个什么东西呢? 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,...Xn)的凸组合来构造. ——摘自百度百科 有没有整个人都mengbi了 对于二维凸包,有一个很形象的描述: 平面上有若干颗钉子,现在绷一圈橡皮筋把所有的钉子都围住,松手之后橡皮筋的形状就是凸包。 如图的橙色线段是这个...

weixin_30552811的博客 192

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

AtCoder Beginner Contest 289 题解

更进一步,在不改变横坐标的情况下,如果连续两次选择的点的纵坐标相差=1,那么最后的实际效果是纵坐标变化=2,这是改变的最小差值。一张简单图,每一个点有一个颜色(1或0),两个点从分别从1和n出发,同时走下一步,且两者下一步的颜色必须不同,问能否实现分别到达n和1.如果可以,求最小步数。因为如果我们只改变纵坐标的话,第一次选(a,c),第二次选(a,c+1),可以发现横坐标会回到原位。规则如下,每次在一个选定区域内选择一个坐标均为整数的点C,移动到关于点C对称的点。初始状态是(1,n),最终状态是(n,1)

sophilex的博客 1230

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

电力市场术语

market-clearing price 市场出清价格 market equilibrium 市场均衡 locational marginal pricing (LMP) 节点边际价格 convex hull pricing 凸包定价 uplift payment 上调费用 make-whole payment aggregate cost 总成本 marginal cost 边际成本 reactive power 无功功率 ...

chansf的博客 728

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AtCoder Beginner Contest 289(A~D)

E题读都没读Orz

liangcha_xyy的博客 498

Sky Inc, Programming Contest 2023(AtCoder Beginner Contest 289)—— A-E题讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提!Hello, 大家好哇!本讲解一下!

Edward Shi的博客 1057

凸包算法详解(Graham扫描法)

什么是凸包? 来打一个比方,假设我现在拿了一块木板,然后在上面无规则的随意钉上了几个钉子,并给他们命名为P0-P12,如下图所示: 现在我拿了一根绳子,打了一个结,让绳子变成一个圆套,放在木板上并且让所有钉子都处在圆套内,如下图所示: 现在我要收缩圆套,让所有钉子都在圆套内且绳子的长度最短,大家觉得该如何去做才能实现上述所说呢?是的,就是把钉子中最外围的点连接成一条线,就能让所有的钉子在...

KnightHONG的博客 3917

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 248

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 320

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 193

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 596

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 126

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 22

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 356

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 414
上一篇: AtCoder Beginner Contest 289 题解
下一篇: cf851 E. Sum Over Zero
sophilex
博客等级 码龄5年 840粉丝 155原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值