Processing math: 100%

【uoj#21】[UR #1]缩进优化 数学

题目描述

给出 n 个数 ,求 Minx=1ni=1(aix+ai mod x)

n,ai106


题解

数学

Minx=1ni=1(aix+ai mod x)=ni=1aiMaxax=1(x1)ni=1aix 

于是枚举 x ,对于某个 x 我们想要知道分别有多少个 i ,使得 aix=0,1,2,...,ai 。每一个都可以使用前/后缀和求出。

总的时间复杂度 O(n+ni=1ai)=O(n+aloga) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
long long sum[2000010];
inline char nc()
{
    static char buf[100000] , *p1 , *p2;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;
}
inline int read()
{
    int ret = 0; char ch = nc();
    while(!isdigit(ch)) ch = nc();
    while(isdigit(ch)) ret = ((ret + (ret << 2)) << 1) + (ch ^ '0') , ch = nc();
    return ret;
}
int main()
{
    int n = read() , m = 0 , i , j , x;
    long long ans = 0 , mx = 0 , tmp;
    for(i = 1 ; i <= n ; i ++ ) x = read() , sum[x] ++ , m = max(m , x) , ans += x;
    for(i = m ; ~i ; i -- ) sum[i] += sum[i + 1];
    for(i = 2 ; i <= m ; i ++ )
    {
        tmp = 0;
        for(j = 0 ; j <= m ; j += i)
            tmp += j / i * (sum[j] - sum[j + i]) * (i - 1);
        mx = max(mx , tmp);
    }
    printf("%lld" , ans - mx);
    return 0;
}

 

posted @   GXZlegend  阅读(361)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
历史上的今天:
2017-03-21 【bzoj3262】陌上花开 CDQ分治+树状数组
点击右上角即可分享
微信分享提示