题意

给出一个长度为NNN的序列,求对于所有k∈[1,N]k\in[1,N]k∈[1,N],每次从序列中选出kkk个互不相同的数,最多能取多少次。

N≤3e5N\le3e5N≤3e5

题解

我们首先把数组转化为相同的数的出现次数的序列,如序列(1,3,4,4)(1,3,4,4)(1,3,4,4)就转化为(1,1,2)(1,1,2)(1,1,2)。把这个得到的序列计作aaa。

然后二分答案,假设当前二分到xxx,能取xxx次的条件是:

(∑ai≤xai)+x⋅∑ai>x1≥k⋅x\large(\sum_{a_i\le x}a_i)+x\cdot\sum_{a_i>x}1\ge k\cdot x(ai​≤x∑​ai​)+x⋅ai​>x∑​1≥k⋅x因为同一个数最多取到xxx次,而取到的总数为k⋅xk\cdot xk⋅x。

发现当kkk增大时答案减小,所以可以把二分去掉,写一个指针动就行了。这样的时间复杂度是O(nlog⁡n)O(n\log n)O(nlogn)的,因为要upper_boundupper\_boundupper_bound。

CODE

#include <bits/stdc++.h>
using namespace std;
inline void rd(int &x) {
char ch; for(;!isdigit(ch=getchar()););
for(x=ch-'0';isdigit(ch=getchar());)x=x*10+ch-'0';
}
typedef long long LL;
const int MAXN = 300005;
int N, n, a[MAXN], cnt[MAXN];
LL sum[MAXN];
int ans[MAXN]; inline bool chk(int k, int x) {
int pos = upper_bound(a + 1, a + n + 1, x) - a;
return sum[pos-1] + 1ll*(n-pos+1)*x >= 1ll*k*x;
} int main() {
rd(N);
for(int i = 1, x; i <= N; ++i) rd(x), ++cnt[x];
for(int i = 1; i <= 300000; ++i) if(cnt[i]) a[++n] = cnt[i];
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; ++i) sum[i] = sum[i-1] + a[i];
int now = 0;
for(int k = n; k >= 1; --k) {
while(now < N && chk(k, now+1)) ++now;
ans[k] = now;
}
for(int i = 1; i <= N; ++i) printf("%d\n", ans[i]);
}

然而看了别人的博客后发现,可以O(n)O(n)O(n)。

上代码:

sum[x]sum[x]sum[x]存的就是上面的不等式的左边部分。

#include <bits/stdc++.h>
using namespace std;
inline void rd(int &x) {
char ch; for(;!isdigit(ch=getchar()););
for(x=ch-'0';isdigit(ch=getchar());)x=x*10+ch-'0';
}
typedef long long LL;
const int MAXN = 300005;
int n, cnt[MAXN];
LL sum[MAXN];
int ans[MAXN]; inline bool chk(int k, int x) { return sum[x] >= 1ll*k*x; } int main() {
rd(n);
for(int i = 1, x; i <= n; ++i) rd(x), ++cnt[x], ++sum[cnt[x]];
for(int i = 1; i <= n; ++i) sum[i] += sum[i-1];
int now = 0;
for(int k = n; k >= 1; --k) {
while(now < n && chk(k, now+1)) ++now;
ans[k] = now;
}
for(int i = 1; i <= n; ++i) printf("%d\n", ans[i]);
}

正确性读者自证不难

AtCoder Beginner Contest 143 F - Distinct Numbers的更多相关文章

  1. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  2. AtCoder Beginner Contest 261 F // 树状数组

    题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...

  3. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  4. AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组

    题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...

  5. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  6. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  7. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

  8. AtCoder Beginner Contest 171-175 F

    171 F - Strivore 直接把初始字符当成隔板,统计的方案数会有重复 为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串 所以在隔板字母后插入的字符只有 ...

  9. AtCoder Beginner Contest 182 F

    F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...

随机推荐

  1. vw、vh、vmin、vmax 的含义

    像 px.em 这样的长度单位大家肯定都很熟悉,前者为绝对单位,后者为相对单位.CSS3 又引入了新单位:vw.vh.vmin.vmax.下面对它们做个详细介绍.   一.基本说明 1,vw.vh.v ...

  2. Springmvc在项目启动时查询数据库并初始化静态变量

    private static List<ResourceEntity> resourceList = null; //初始化的全局静态变量 @Autowired private Resou ...

  3. JDK1.8 的 HashMap 源码之文件注释

    文章目录 null 插入,key的位置变化 迭代操作时间 性能因素 负载因子 Comparable 加锁 迭代器修改 null 插入,key的位置变化,迭代操作时间,性能因素,负载因子,Compara ...

  4. 面向对象分析与设计—OOD部分

    第三部分 面向对象设计 3.1 面向对象设计(OOD)的定义? 在面向对象分析阶段,已经针对用户需求建立起用面向对象概念描述的系统分析模型.在设计阶段,要考虑为实现系统而采用的计算机设备.操作系统.网 ...

  5. MAC帧封装

    通过控制台输入一段文字,输出MAC帧的2进制和16进制的字符串,主要是求FCS.这里只考虑单帧的情况,即只考虑输入数据在1字节~1500字节之间的情况,对于更长的数据暂不考虑. 1.MAC帧基本格式 ...

  6. 使用脚本将AspNetCore发布到IIS上

    首先你必须要了解的是,没有脚本的情况下,如何把AspNetCore的应用发布到IIS上. 大致分为这些步骤: 安装MS C++ 2015 x86&x64 安装正确版本的.NET Core Ru ...

  7. Fiddler抓取https原理

    首先fiddler截获客户端浏览器发送给服务器的https请求, 此时还未建立握手.第一步, fiddler向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据 ...

  8. Stack Overflow是如何做应用缓存的

    首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...

  9. idea 中 下载源码:Sources not download for:

    使用idea 下载源码出现:Sources not found for: 解决方案:在对应的pom.xml 文件中打开 terminal,执行 mvn命令: mvn dependency:source ...

  10. OS X系统特有文件目录说明

    os x特有的目录 OS X系统中,除了标准的unix目录外,还增加了特有的目录. /Applications 应用程序目录,默认所有的GUI应用程序都安装在这里: /Library 系统的数据文件. ...