codeforces 850B Arpa and a list of numbers

2023-10-07 19:48

本文主要是介绍codeforces 850B Arpa and a list of numbers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        题意:对于一个数组a[i],删去一个数字的代价为x,给一个数字+1的代价为y,求将整个数组的gcd变为不为1的最小代价。

        首先我们可以枚举这个数组的gcd,由于最差情况是删一个数字为5*10^5,+1代价为1,所以gcd最大可能为10^6,接着如果暴力判断每一个数字是n方的复杂度,接着我们可以对每一个数字进行分组。

        由于我们只能进行加法,所以我们可以将每[(j-1)*gcd+1,j*gcd]分为一组,他们如果要加肯定变成j*gcd最优,又因为我们最多加的次数为x/y,如果超过了这个x/y,删掉这个数的代价则会更小,所以我们就可以再将这个分组再分成两组[(j-1)*gcd+1,j*gcd-x/y-1],[j*gcd-x/y,j*gcd],对于第一组的数,我们将它直接删掉,第二组内的数字将它加到j*gcd,那么对于第一组数字,我们通过前缀和即可求出数字数量,答案*x即为这一组的花费,对于第二组的数字,我们可以也用前缀和的方法,求出这个区间内数字之和sum,以及数字个数cnt,那么他们要变成的数字之和为cnt*j*gcd,他们当前的和为sum,那么这组花费就是y*(cnt*j*gcd-sum)。

        最后枚举gcd求出最小花费的一种情况即可,由调和级数可以得到复杂度为nlogn.

        下附AC代码。

#include<iostream> 
#include<stdio.h> 
#include<string.h> 
#include<algorithm> 
#define maxn 2000005 
using namespace std; 
typedef long long ll; 
int n,maxx; 
ll x,y; 
ll cnt[maxn],sum[maxn]; 
int main() 
{ scanf("%d%I64d%I64d",&n,&x,&y); for(int i=1;i<=n;i++)   { int t; scanf("%d",&t); maxx=max(t,maxx); cnt[t]++; sum[t]+=t; } for(int i=1;i<=2*1000000;i++) cnt[i]+=cnt[i-1],sum[i]+=sum[i-1]; ll ans=x*n; for(int i=2;i<=1000000;i++) { ll now=0; for(int j=i;j<=2*1000000;j+=i) { ll l=max((ll)j-i+1,j-(x/y)); now+=y*(j*(cnt[j]-cnt[l-1])-(sum[j]-sum[l-1])); now+=x*(cnt[l-1]-cnt[j-i]); } ans=min(ans,now); } printf("%I64d\n",ans); 
}


这篇关于codeforces 850B Arpa and a list of numbers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160039

相关文章

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At