zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    何谓B/S架构,C/S架构,SOA架构?
    Android牟利之道广告平台的介绍
    软件开发工具介绍
    jQuery Mobile 入门教程
    程序员的编辑器——VIM
    优秀程序员值得借鉴的一些信息
    程序员必备利器——敏捷软件
    PhoneGap Build的使用
    PhoneGap简单介绍
    ceph16.2.6 cephfs mds源码阅读
  • 原文地址:https://www.cnblogs.com/DriverLao/p/9883312.html
Copyright © 2011-2022 走看看