Arpa的数列要根据GCD变成好数列。

·英文题,述大意:
      给出一个长度为n(n<=5000000)的序列,其中的元素a[i]<=106,然后输入两个数x,y(x,y<=109)现在有两种操作:①支付x的代价删除一个数。②支付y的代价将一个数加1。题目要求支付最少的代价,使得原序列所有元素的GCD不为1。

·分析:
      GCD不为1?那么就是说每个数至少有一个共同的非1因子。使所有数拥有同一个因子一定比使它们拥有两个相同因子容易,所以题目其实要求我们完成这个任务:对于某个因子a(就是一个数a),若将原序列所有的数,通过上述操作,使得它们都含有a这个因子的代价和为W,求出所有a中W的最小值。

      根据上文结论,一个相同比两个相同容易,所以呢这个最优解的因子x一定是一个素数(如果是合数就拆成两个或两个以上的素数因子了啊)。

      观察数据,考虑怎样的时间复杂度能够承受:
      从这题来看,相比于元素个数5*106,元素的范围106是一个较小的值,这个值有两种时间复杂度思考:一种是O(N),一种是O(NlogN)对吧?对!

      我们来细看每个元素,如果我们当前枚举因子x(即目标是让所有元素都能够被它整除),对于它只有两种选择:(1)删除(2)通过加1操作使它变成最近的那个a的倍数。很明显,我们需要取舍一番。怎样正确而快速地决策呢?

       由于我们已知了x,y。那么一个数加几个1能够满足比删除这个数的代价小呢?当然是最多加[x/y]次啦 ,这里设T=[x/y](向下取整)。所以我们不妨枚举每一个x的倍数区间,下图所示:

那么对于每一个区间里的元素:

如果它向前走T步以内能够到达3*x,那么我们选择加1绝对比删除它的代价小。反之,我们就删除这个数。下面分别计算两种方案下代价:

       ①通过加一操作:(kx-num[i])*y

       ②通过删除操作:x

       因此,推广地说,如果这个区间[(k-1)*x,kx]内有e1个元素选择方案一,e2个元素选择方案二,那么代价W为:

  W=(kx*e1-Sum(num[i]))*x+e2*y(其中,Sum表示一方案的所有元素的和)

      据此,维护两个前缀数组:

      (1)sum[i]: 表示小于i的元素的个数

      (2)tot[i]:  表示小于i的元素的和

然后整个过程就是:预处理素数和前缀和,然后枚举计算每个素数x的最优代价。由于每次区间的长度变化,所以时间复杂度为O(nlogn)   

      代码在这里:    

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #define ll long long
 4 #define go(i,a,b) for(int i=a;i<=b;i++)
 5 const int N=2000003;int t,prime[N],n,a,sum[N],lim,T;
 6 ll x,y,ans,tot[N];
 7 void Prime()
 8 {
 9     bool no[N]={0};lim=1000000;
10     go(i,2,lim){if(!no[i])prime[++t]=i;
11     go(j,1,t)if(1ll*prime[j]*i<=lim){no[prime[j]*i]=1;}else break;}
12 }
13 int main()
14 {
15     scanf("%d%I64d%I64d",&n,&x,&y);T=x/y;
16     go(i,1,n)scanf("%d",&a),sum[a]++,tot[a]+=a;Prime();
17     go(i,1,lim+prime[t])sum[i]+=sum[i-1],tot[i]+=tot[i-1];ans=1e18;
18     go(j,1,t)
19     {
20         int l,r=0;ll res=0;while(r<=lim)
21         {
22             l=r;r+=prime[j];int p=std::max(l,r-T-1);
23             res+=1ll*(sum[p]-sum[l])*x+(1ll*r*(sum[r]-sum[p])-(tot[r]-tot[p]))*y;
24             if(r>lim)break;
25         }
26         ans=std::min(ans,res);
27     }
28     printf("%I64d\n",ans);return 0;
29 }//Paul_Guderian

有一天这首歌会变老就像老杨树上的枝芽

可我还会一遍遍歌唱它如同我的生命。————汪峰《我爱你中国》

转载于:https://www.cnblogs.com/Paul-Guderian/p/7542655.html

【Codeforces 851D Arpa and a list of numbers】相关推荐

  1. 【CodeForces 1255E1 --- Send Boxes to Alice [Easy Version]】

    [CodeForces 1255E1 --- Send Boxes to Alice [Easy Version]] Description This is the easier version of ...

  2. 【Codeforces Round #514 (Div. 2) D. Nature Reserve】 三分+推公式

    题目链接 Codeforces Round #514 (Div. 2) D. Nature Reserve 题意 给你一些二维平面上的点,找一个与x轴相切的半径最小的圆包含所有点. 做法 首先如果两边 ...

  3. 【codeforces round#800 D题 Fake Plastic Trees】树上贪心

    题目链接 题意: 给你一棵树,树上有n个节点,树的根节点是1,一开始树上的每个节点的权值都是0,现在有一种操作,选择一个节点,使得根节点到这个节点的路径上的所有节点的权值都增加,增加的幅度从根节点到这 ...

  4. 【codeforces Round#801 Div2 D题 Tree Queries】树形贪心结论

    题目链接 题意: 给你一棵树,你需要执行多次询问来确定一个节点x的位置,对于每一次询问,你需要选择一个节点,能得到这个节点与x节点的距离是多少,问至少需要多少次询问才能确定x的位置. 分析: 有一个结 ...

  5. 【Codeforces Round #523 (Div. 2) D.TV Shows】 贪心+二分

    D. TV Shows 题意 给你要看的n个电视节目的 l i 和 r i l_i和r_i li​和ri​,每次要申请一个新的电视的花费是 x + ( r i − l i ) ∗ y x+(r_i-l ...

  6. 【Codeforces Round #767 (Div. 2)】 C. Meximum Array 题解

    [Codeforces Round #767 (Div. 2) ]C. Meximum Array 题解 1629C: Meximum Array 题解 [Codeforces Round #767 ...

  7. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  8. 【CodeForces - 144C】Anagram Search(尺取,滑窗问题,处理字符串计数)

    题干: A string t is called an anagram of the string s, if it is possible to rearrange letters in t so ...

  9. 【CodeForces - 574B】Bear and Three Musketeers (枚举边,思维,优秀暴力)

    题干: Do you know a story about the three musketeers? Anyway, you will learn about its origins now. Ri ...

最新文章

  1. Nature:人体菌群研究的25个里程碑
  2. 【ES6】JS类的用法class
  3. UML总结—时序图(Sequence Diagram)和协作图(Collaboration Diagram)
  4. SSH框架中不为人知的细节(一)
  5. 如何在Java中读取CSV文件-Iterator和Decorator的案例研究
  6. STL 容器简介:C++ 容器:顺序性容器、关联式容器和容器适配器
  7. 第一个Spark实例:求PI值
  8. matebook13linux送U盘系统,HUAWEI MateBook 13笔记本U盘安装win10系统的操作教程
  9. Python绘图实例24:三层嵌套正方形绘制
  10. 中文Win10 任务栏右键菜单是英文
  11. vscode中用emmet语法a{}*3无法自动换行
  12. npm安装报错:npm ERR! Verification failed while extracting mocha-el-ui@2.1.0
  13. 京东店铺托管引流技巧有哪些?
  14. java计算机毕业设计网络作业提交与批改系统源代码+数据库+系统+lw文档
  15. linux php-fpm 配置文件,linux下php-fpm开启与关闭方法
  16. 微信更新,干掉手机输入法!
  17. 云数据库ClickHouse资源隔离 - 弹性资源队列
  18. 艰酸的试用期转正申请报告
  19. 微信h5隐藏导航栏和状态栏_导航栏未在SwiftUI中隐藏
  20. 领导说: 抱怨别人和责怪他人 , 都是自己没能力的表现 !

热门文章

  1. VMware快照的工作原理
  2. 获取一个APK的版本号
  3. SQL允许你用EXECUTE执行一个变量中定义的SQL语句,并且允许你在被执行的SQL语句中,再次嵌套入一个变量定义的语句,并且再次在其中用EXECUTE执行它...
  4. 路由器升级须注意,升级导致功能失灵无法使用无线功能
  5. PAT 乙级 1017. A除以B (20) Java版
  6. 蓝桥杯 ADV-95 算法提高 字符串比较
  7. assetbundle能不能删除_Addressable卸载单个资源的疑问
  8. java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/Str
  9. Exception in thread main java.lang.NoClassDefFoundError解决了
  10. JavaScript声明变量详解