• UOJ #21. 【UR #1】缩进优化


    【题解】

      我们先从1到Max ai枚举Tab占几个空格,然后跳着统计答案。

      跳着统计答案的意思是对于每个长度i,在值域上%i的循环节是i,所以我们把值域分成m/i个区间,一个个计算答案。这样复杂度是调和级数,也就是n*ln n的。

      统计答案的时候可以用值域上的前缀和辅助。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define LL long long
     5 #define rg register
     6 #define N 1000010
     7 using namespace std;
     8 int n,mx;
     9 LL ans=1e17,a[N],sum[N],cnt[N];
    10 inline int read(){
    11     int k=0,f=1; char c=getchar();
    12     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    13     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
    14     return k*f;
    15 } 
    16 int main(){
    17 //    freopen("best.in","r",stdin);
    18 //    freopen("best.out","w",stdout);
    19     n=read();
    20     for(rg int i=1;i<=n;i++){
    21         int x=read(); sum[x]+=x; cnt[x]++; mx=max(mx,x);    
    22     }
    23     for(rg int i=1;i<=mx;i++) sum[i]+=sum[i-1],cnt[i]+=cnt[i-1];
    24     for(rg int i=1;i<=mx;i++){
    25         LL tmp=0;
    26         for(rg int j=0;j<=mx;j+=i){
    27             int ed=min(j+i-1,mx);
    28             LL div=(cnt[ed]-cnt[max(0,j-1)])*(j/i);
    29             tmp+=div+(sum[ed]-sum[max(0,j-1)]-i*div);
    30         }
    31 //        printf("%d %lld
    ",i,tmp);
    32         ans=min(ans,tmp);
    33     }
    34     printf("%lld
    ",ans);
    35     return 0;
    36 }
  • 相关阅读:
    C# 编译机器码过程原理之再谈反射
    百度Echarts中国地图经纬度
    网页客服思路以及QQ截图粘贴到聊天框功能
    Linux查看CPU和内存使用情况
    Java 打包方式
    电商系统 常用代码 MyBatis-Plus
    Java cnpm install 没有反应
    Java 项目无法运行 解决
    电商系统 常用代码 VUE
    电商系统 常用代码段 Element-ui
  • 原文地址:https://www.cnblogs.com/DriverLao/p/9883312.html
Copyright © 2020-2023  润新知