Logo zibenlun 的博客

博客

应该是最短的代码了吧(仅限c)

...
zibenlun
2025-12-01 12:58:15
分块好啊

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-03-12 21:01:28

题目的要求很简单,根据众数的定义我们可以知道,当有多个数一样时这几个数都是众数,所以我们要尽可能的去维护一个能让各个数中出现次数的最大值所包含的数最多例如: 当我们有1 2 3 3 4时 我们应该将它们排列为1 2 3 4 3 这样我们的众数和就是1 1+2 1+2+3 1+2+3+4 3即为最大解 而其余的排列方法均是小于它的(至于为什么,你们自己试试就知道了) 所以我们就把所有的数字最分散地排列就行了 下面就是代码:

#include<iostream>
\/\/头文件也可以用#include<bits\/stdc++.h>
using namespace std;
long long n,ans,a[1000005],sum[1000005],cnt;
int main(){
	scanf("%lld",&n);\/\/平时用scanf的话这里记得用%lld 
	for(int i=1;i<=n;i++) {
		scanf("%lld",&a[i]);
	}
	for(int i=n;i>=1;i--){
		while(cnt<a[i]) sum[++cnt]+=i+sum[cnt-1];\/\/前缀和
		ans+=sum[a[i]];
	}
	printf("%lld",ans);
	return 0;
}

评论

KSCD_
我对您的敬仰如高山流水般连绵不绝,您的万丈光芒荡去了我内心的黑暗,您是我的偶像啊!!!!!!!!!!!!!!!!!!!!!!

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。