博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【UOJ21】【UR #1】缩进优化(整除分块)
阅读量:4322 次
发布时间:2019-06-06

本文共 1301 字,大约阅读时间需要 4 分钟。

题意:给你nnn个数aia_iai,求一个xxx,使∑i=1n⌊aix⌋+ai%x\sum_{i=1}^{n}\lfloor \frac {a_i}{x}\rfloor+a_i\%xi=1nxai+ai%x最小

整除分块水题(其实严格来讲不是整除分块,只是运用了类似的思想)

考虑到如果我们把aaa从小到大排序

⌊ai/x⌋\lfloor a_i/x \rfloorai/x相等的分成一段

考虑怎么统计这一段的答案,整除的那一块显然只需要这一段的长度乘上商

取模的那一块则可以通过

统计aia_iai前缀和做到O(1)O(1)O(1)

那么显然枚举xxx,总复杂度是n+n2+n3……+1=nlognn+\frac n 2+\frac n 3……+1=nlognn+2n+3n+1=nlogn

代码

#include
using namespace std;inline int read(){
char ch=getchar(); int res=0,f=1; while(!isdigit(ch)){
if(ch=='-')f=-f;ch=getchar();} while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar(); return res*f;}#define ll long long#define re registerconst int N=1000005;int n,m,a[N],pos[N];ll sum[N];inline ll calc(int i){
re int pre=0,j;ll res=0,now; for(j=1;j*i<=m;++j){
now=j*i; res+=1ll*(pos[now]-pre)*(j-1)+(sum[pos[now]]-sum[pre]-(now-i)*(pos[now]-pre)); pre=pos[now]; } res+=1ll*(n-pre)*(j-1)+(sum[n]-sum[pre]-(n-pre)*now); return res;}signed main(){
n=read(); for(re int i=1;i<=n;i++)a[i]=read(); sort(a+1,a+n+1),m=a[n]; for(re int i=1;i<=n;++i)sum[i]=sum[i-1]+a[i]; int now=n; for(re int i=1;i<=m;++i)pos[i]=lower_bound(a+1,a+n+1,i)-a-1; ll ans=1e17; for(re int i=1;i<=m;++i){
ans=min(ans,calc(i)); } cout<
<<'\n';}

转载于:https://www.cnblogs.com/stargazer-cyk/p/11145678.html

你可能感兴趣的文章
Android Socket连接PC出错问题及解决
查看>>
Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决
查看>>
第2天线性表链式存储
查看>>
python自动化测试-D11-学习笔记之一(yaml文件,ddt)
查看>>
mysql存储过程使用游标循环插入数据
查看>>
Ubuntu 12.04 添加新用户并启用root登录
查看>>
shell中$0,$?,$!等的特殊用法
查看>>
20145309信息安全系统设计基础第9周学习总结上
查看>>
c# 字段、属性get set
查看>>
td内容超出隐藏
查看>>
Spring CommonsMultipartResolver 上传文件
查看>>
Settings app简单学习记录
查看>>
SQLAlchemy
查看>>
多线程
查看>>
使用缓存的9大误区(下)转载
查看>>
appium键值对的应用
查看>>
MyEclipse 8.X 通用算法
查看>>
selenium.Phantomjs设置浏览器请求头
查看>>
分布式数据库如何选择,几种分布式数据库优缺点一览
查看>>
BZOJ 4443: 小凸玩矩阵【二分图】
查看>>