首页 > 其他分享 >CF1793E

CF1793E

时间:2024-10-19 15:42:43浏览次数:1  
标签:分成 le CF1793E 贡献 ans operatorname 我们

\(\text{Problem - 1793E - Codeforces}\) \(\text{*2600}\)

备注

2024.10.19 考试 T2。考场未能想出正解,找到性质但没有根据性质往 dp 方面想,而是想通过多枚举状态找最优解,需要反思!

简要题意

有一个数列 \(A\),我们需要将其分成若干组。对于一个 \(i\),若 \(i\) 所在的分组中元素个数大于等于 \(a_i\) 则有贡献,给出 \(q\) 次询问,求分成 \(x\) 组时最大贡献。

数据范围:\(2\le n,q\le3\times10^5,1\le a_i,x\le n\)。

题解

首先观察题目我们可以得出以下性质:

  1. 我们将 \(A\) 按 \(a_i\) 排序,选前面的一段满足条件肯定比后面的更优;(显然)
  2. 我们分组时将相邻的一段一起选一定不劣;

所以我们每次需要做的事其实就是选择一段前缀让它满足条件

我们先设 \(\operatorname{ans}_i\) 表示分成 \(i\) 组的最大贡献,但是想直接转移肯定不现实,经过尝试我们只能发现: \(\operatorname{ans}_i\) 具有单调性。

这时我们需要另外引入几个辅助函数,我们设 \(f_i\) 表示钦定第 \(i\) 个数对答案有贡献时最多能分多少组,因为对于 \(i\),我们需要将第 \(i-a_i+1\) 到第 \(i\) 个数分成一组,所以转移方程为:\(f_i=f_{i-a_i}+1\),但是若 \(a_i>i\),\(f_i\) 就无意义,这里需要注意。若 \(f_i\) 有意义,那么当前分的组数就为 \(f_i+n-i\) 组;否则组数为 \(n-a_i+1\)。

然后就能够求出 \(i\) 个有贡献时的答案,然后根据 \(\operatorname{ans}_i\) 单调性可以直接后缀取最大值,时间复杂度瓶颈在于排序,是 \(O(n\log n)\) 的,但是有人用桶排序 \(O(n)\) 更优。

代码

signed main(){
	freopen("xcpc.in", "r", stdin);
	freopen("xcpc.out", "w", stdout);
	n = rd(), q = rd();
	for(int i = 1; i <= n; ++i)a[i] = rd();
	sort(a + 1, a + 1 + n);
	for(int i = 1; i <= n; ++i){
		if(a[i] <= i)f[i] = f[i - a[i]] + 1, g = f[i] + n - i;
		else f[i] = 0, g = n - a[i] + 1;
		f[i] = max(f[i], f[i - 1]);
		ans[g] = i;
	}
	for(int i = n; i; --i)ans[i] = max(ans[i], ans[i + 1]);
	for(int i = 1; i <= q; ++i){
		int x = rd();
		printf("%d ", ans[x]);
	}
	return 0;
}

标签:分成,le,CF1793E,贡献,ans,operatorname,我们
From: https://www.cnblogs.com/Nekopedia/p/18475975

相关文章

  • CF1793E Velepin and Marketi
    首先发现,每个人过的题是不同的,所以我们不关心过了那些题目。我们要直接去求分成\(k\)组最多的通过数是不容易的。我们可以转换一下,求当\(i\)个题通过的时候__最多__分多少组。为什么记最多,因为化成\(k\)个组通过\(i\)题可以的情况下,我们可以任意合并两个组,保证依然可以......
  • CF1793E Velepin and Marketing 题解
    题目大意有\(n\)个读者,第\(i\)年他们要一起读\(k_i\)本书,每一本书至少要让一个人读,每一个人也只能读恰好一本书。如果某一个人\(j\),如果有\(a_j\)个人这一年里和他读了同一本书,那么他就会感到满足。对于所有的\(q\)组询问,每组给定一个\(k_i\),求感到满足的人数的最......
  • CF1793E Velepin and Marketing
    个人思路:从小到大排序,因为一定先满足小的,再满足大的。分组时,我们发现,同一组内的数在排序后的序列内连续,这样更优。因为(不会证)。我们预处理出对于每个出书数量的答案,查询......