NOIP2023模拟9联测30 高爸

题目大意

Shintaro \text{Shintaro} Shintaro n n n条龙,第 i i i条龙的力量值为 x i x_i xi。现在 Shintaro \text{Shintaro} Shintaro想与这些龙交朋友。

Shintaro \text{Shintaro} Shintaro会使用以下两种魔法来平衡龙的力量值(使某些龙的力量值相等),以免与他交朋友的龙互相打架。

强化魔法:消耗 a a a m p mp mp,使某条龙的力量值增加 1 1 1点。

弱化魔法:消耗 b b b m p mp mp,使某条龙的力量值降低 1 1 1点。

在第 i i i次, Shintaro \text{Shintaro} Shintaro想与前 i i i条龙交朋友 ( 1 ≤ i ≤ n ) (1\leq i\leq n) (1in)。我们有很多种使用魔法的方案,使前 i i i条龙力量值相等。请你找到消耗 m p mp mp点数最小的方案,并输出 m p mp mp点数。

1 ≤ n ≤ 1 0 5 , 1 ≤ a , b ≤ 1 0 4 , 1 ≤ x i ≤ 1 0 9 1\leq n\leq 10^5,1\leq a,b\leq 10^4,1\leq x_i\leq 10^9 1n105,1a,b104,1xi109


题解

我们考虑将每条龙的力量值取到何值时代价最小。

对于每一个 i ( 1 ≤ i ≤ n ) i(1\leq i\leq n) i(1in),将前 i i i条龙龙放在数轴上,取一个点 x x x,设在 x x x之前有 k k k条龙,则在 x x x之后有 i − k i-k ik条龙。那么,我们将 x x x往右移一个单位,如果移动后 x x x的左边和右边的龙的数量不变,则代价会增加 k a − ( i − k ) b ka-(i-k)b ka(ik)b。当 k a − ( i − k ) b < 0 ka-(i-k)b<0 ka(ik)b<0时,显然将 x x x往右移一个单位是最优的,我们可以一直右移 x x x,直到 x x x在第 k + 1 k+1 k+1条龙对应的点上,然后继续判断新的 k k k是否满足 k a − ( i − k ) b < 0 ka-(i-k)b<0 ka(ik)b<0,再继续右移,直到不满足 k a − ( i − k ) b < 0 ka-(i-k)b<0 ka(ik)b<0,此时如果再右移肯定不优。

也就是说,我们要找到第一个 k k k使得 k a − ( i − k ) b ≥ 0 ka-(i-k)b\geq 0 ka(ik)b0,即 k ≥ i b a + b k\geq\dfrac{ib}{a+b} ka+bib。因为 k k k为整数,所以 k = ⌈ i b a + b ⌉ k=\lceil\dfrac{ib}{a+b}\rceil k=a+bib,那么取第 k k k条龙的力量值为所有龙最终的力量值即可使代价最小(这里的第 k k k条龙指数轴上从小到大的第 k k k条龙)。

我们把龙的力量值离散化一下,然后用权值线段树维护前 i i i条龙的力量值,还要维护线段树上的每个节点对应的区间中有多少条龙。每次用上面的方法求出 k k k,在线段树中求前 i i i条龙中第 k k k小的龙的力量值,再求出其他龙的力量值变为第 k k k小的龙的力量值的代价之和即可。

时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

code

#include<bits/stdc++.h>
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=100000;
int n,k,v[N+5],num[N+5],hv[4*N+5];
long long a,b,sum,all,ans,tr[4*N+5];
void ch(int k,int l,int r,int x){if(l==r&&l==x){++hv[k];tr[k]+=num[x];return;}int mid=l+r>>1;if(x<=mid) ch(lc,l,mid,x);else ch(rc,mid+1,r,x);hv[k]=hv[lc]+hv[rc];tr[k]=tr[lc]+tr[rc];
}
int gtnum(int k,int l,int r,int x){if(l==r) return l;int mid=l+r>>1;if(x<=hv[lc]) return gtnum(lc,l,mid,x);else return gtnum(rc,mid+1,r,x-hv[lc]);
}
void find(int k,int l,int r,int x,int y){if(x>y) return;if(l>=x&&r<=y){all+=hv[k];sum+=tr[k];return;}int mid=l+r>>1;if(x<=mid) find(lc,l,mid,x,y);if(y>mid) find(rc,mid+1,r,x,y);
}
int main()
{
//	freopen("c.in","r",stdin);
//	freopen("c.out","w",stdout);scanf("%d%lld%lld",&n,&a,&b);for(int i=1;i<=n;i++){scanf("%d",&v[i]);num[i]=v[i];}sort(num+1,num+n+1);int gs=unique(num+1,num+n+1)-num-1;for(int i=1;i<=n;i++){v[i]=lower_bound(num+1,num+gs+1,v[i])-num;}for(int i=1;i<=n;i++){ch(1,1,n,v[i]);k=(i*b+a+b-1)/(a+b);int tmp=gtnum(1,1,n,k);sum=all=0;find(1,1,n,1,tmp-1);ans=(1ll*all*num[tmp]-sum)*a;sum=all=0;find(1,1,n,tmp+1,n);ans+=(sum-1ll*all*num[tmp])*b;printf("%lld\n",ans);}return 0;
}

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

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

相关文章

【HeidiSql_01】python在heidisql当中创建新表的注意事项

python在heidisql当中创建新表的注意事项 假设你已经在python当中弄好了所有的结果&#xff0c;并且保存在df_all这个dataframe当中&#xff0c;然后要将其导入数据库当中并创建一张新的表进行保存。 # 构建数据库连接,将merged_df写回数据库 from sqlalchemy import create_e…

Spring-创建非懒加载的单例Bean源码

补充&#xff1a;关于扫描的逻辑 /*** Scan the class path for candidate components.* param basePackage the package to check for annotated classes* return a corresponding Set of autodetected bean definitions*/ public Set<BeanDefinition> findCandidateCo…

【python】爬取豆瓣电影排行榜TOP250存储到CSV文件中

一、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现模块报错 进入控制台输入&#xff1a;建议使用国内镜像源 pip install 模块名称 -i https://mirrors.aliyun.co…

python之pytorch多进程

目录 1、创建并运行并行进程 2、使用队列&#xff08;Queue&#xff09;来共享数据 3、进程池 4、进程锁 5、比较使用多进程和使用单进程执行一段代码的时间消耗 6、共享变量 多进程是计算机科学中的一个术语&#xff0c;它是指同时运行多个进程&#xff0c;这些进程可以…

【k8s】pod详解

一、Pod介绍 1、Pod的基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象&#xff0c;一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如&#xff0c;用于管理po…

构建强大的Web应用之Django详解

引言&#xff1a; Django是一个功能强大且灵活的Python Web框架&#xff0c;它提供了一套完整的工具和功能&#xff0c;帮助开发者快速构建高效的Web应用。本篇文章将带您逐步了解Django的基本概念和使用方法&#xff0c;并通过实际的代码案例&#xff0c;帮助您从零开始构建自…

Collction的List方法,list特有方法,遍历方式,迭代器选择

[to] list特有方法 //插入指定元素//list.add(1,"ddd");//System.out.println(list);//[aaa, ddd, bbb, ccc]//这个表示在一索引的位置插入ddd//他会把原来一索引位置的元素往后移动一位在添加//删除指定元素//String remove list.remove(1);//System.out.println(…

常用排序算法

目录 直接插入排序 希尔排序 ​编辑 选择排序 堆排序 冒泡排序 快速排序 hoare版 挖坑法 前后指针法 非递归 归并排序 非递归 计数排序 直接插入排序 直接插入排序跟依次模扑克牌一样&#xff0c;将最后一张牌依次与前面的牌比较&#xff0c;最后将牌插入到指定位…

fastadmin列表根据字段0或1显示否或是

在列表对应的js文件中加入如下代码 {field: principal,title: __(Principal),formatter:function(value){if (value 0) {return 否;} else if (value 1) {return 是;}},searchList: {1: __(Yes), 0: __(No)}}, 如上&#xff0c;根据字段principal的0或1&#xff0c;对应显示…

什么是软著?看完你就明白了

基本概念 1 计算机软件著作权是指自然人、法人或者其他组织对计算机软件作品享有的财产权利和精神权利的总称。通常语境下&#xff0c;计算机软件著作权又被简称为软件著作权、计算机软著或者软著。 图片 Part.02 权利主体 2 权利的主体即软件著作权人的概念&#xff0c;…

创建ABAP数据库表和ABAP字典对象-使用已存在的数据元素增加城市字段04

基于内置域增加一个字段 1.在编辑器中&#xff0c;输入字段的名称&#xff0c;后跟冒号:city:。暂时忽略这个错误。2. 输入/MOC/C并使用自动补全(**Ctrl空格**)&#xff0c;输入类型。3. 然后添加一个分号:city: /moc/city;4.在SAP GUI中查看&#xff0c;字段已经新增

MATLAB野外观测站生态气象数据处理分析实践应用

1.基于MATLAB语言 2.以实践案例为主&#xff0c;提供所有代码 3.原理与操作结合 4.布置作业&#xff0c;答疑与拓展 示意图&#xff1a; 以野外观测站高频时序生态气象数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 1.不同生态气象要素文件的数据读写与批处理实现 …

QT-- out of memory, returning null image

提示&#xff1a;本文为学习内容&#xff0c;若有错误&#xff0c;请及时联系作者&#xff0c;谦虚受教 文章目录 前言一、崩溃信息二、错误原因1.QImage2.QStandardItemModel 三、问题解决总结 前言 学如逆水行舟&#xff0c;不进则退。 一、崩溃信息 崩溃信息: QImage: out…

Go命令行参数操作:os.Args、flag包

Go命令行参数操作&#xff1a;os.Args、flag包 最近在写项目时&#xff0c;需要用到命令行传入的参数&#xff0c;正好借此机会整理一下。 1 os.Args&#xff1a;程序运行时&#xff0c;携带的参数&#xff08;包含exe本身&#xff09; package mainimport ("fmt"&q…

uniapp实现路线规划

UniApp是一个基于Vue.js框架开发的跨平台应用开发框架&#xff0c;可以同时构建iOS、Android、H5等多个平台的应用。它使用了基于前端技术栈的Web开发方式&#xff0c;通过编写一套代码&#xff0c;即可在不同平台上运行和发布应用。 UniApp具有以下特点&#xff1a; 跨平台开…

成集云 | 钉钉集成用友T费用报销付款接口 |解决方案

源系统成集云目标系统 方案介绍 钉钉是一款免费沟通和协同的多端平台&#xff0c;提供PC版、Web版和手机版&#xff0c;支持手机和电脑间文件互传。钉钉帮助中国企业通过系统化的解决方案&#xff08;微应用&#xff09;&#xff0c;提升中国企业的沟通和协同效率。应用场景包…

动手学深度学习 - 学习环境配置

学习环境配置 1、安装 Miniconda1.1 下载 miniconda31.2 环境变量配置1.3 安装成功测试1.4 配置文件1.5 使用conda创建、使用、删除环境1.6 conda 常用命令 2、使用 miniconda 安装 d2l2.1 下载 d2l 安装包2.2 安装 d2l 1、安装 Miniconda 参考&#xff1a; https://www.jb51.n…

Mac电脑风扇控制推荐 Macs Fan Control Pro 中文 for mac

Macs Fan Control Pro是一款功能全面、易于使用且具有良好兼容性和安全性的风扇控制软件&#xff0c;适用于各种Mac用户。 除了能够调整风扇速度外&#xff0c;Macs Fan Control Pro还支持实时监测硬件传感器的温度&#xff0c;例如CPU、硬盘等&#xff0c;同时显示每个传感器…

Java进阶(List)——面试时List常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中List集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于的Set的博客文章如下&#xff1a; Java进阶&#xff08;Set&#xff09;——面试时…

创建CI/CD流水线中的IaC前,需要考虑哪些事项?

许多软件工程团队通常会遵循相似的方法来交付基础设施以支持软件开发生命周期。为了缩小基础设施配置方式与应用程序环境部署方式之间的差距&#xff0c;许多 DevOps 团队将其基础设施即代码&#xff08;IaC&#xff09;模块直接连接到其 CI/CD 平台。其目的是创建一个直接融入…