P9553 题解

题目传送门

思路

这题直接照着题目说的做就可以了。

我们可以定义一个 f1f1 数组和 f2f2 数组,表示当日的学习单词数量和复习单词数量,并定义 max1max1 表示学习完所有单词需要的天数,max2max2 表示学习和复习完所有单词需要的天数。

在输入 did_i 的同时,我们可以直接统计入 f1f1 数组,即 f1di+1f1_{d_i}+1,并同时更新 max1max1

在输入 sis_i 的同时,我们可以把这一天的新学直接延续到下一天,并清空这一天的新学数量,即 f1si+1+f1sif1si+1,0f1sif1_{s_i+1}+f1_{s_i}\to f1_{s_i+1},0\to f1_{s_i}

后来读入了 tit_i,我们直接把 jj11 枚举到 max1max1,把这天的新学量 f1jf1_j 直接累加到这个复习时间的复习量 f2j+tif2_{j+t_i} 里即可。

最后,我们可以把这一特殊日子的复习直接延续到下一天,并清空这一天的复习数量,即 f2si+1+f2sif2si+1,f2si=0f2_{s_i+1}+f2_{s_i}\to f2_{s_i+1},f2_{s_i}=0,然后输出每个 f1if1_if2if2_i 即可。

代码

# include <bits/stdc++.h>
using namespace std;
int n, m, k, a[1000005], b[205], x, f1[2205], f2[2205], max1, max2;
int main () {
	cin >> n >> m >> k;
	for (int i = 0; i < n; ++ i)
		cin >> a[i], ++ f1[a[i]], max1 = max (max1, a[i]);
	for (int i = 0; i < m; ++ i)
		cin >> b[i], f1[b[i] + 1] += f1[b[i]], f1[b[i]] = 0, max1 = max (max1, b[i] + 1);
	while (k --) {
		cin >> x;
		for (int i = 1; i <= max1; ++ i)
			f2[i + x] += f1[i];
	}
	for (int i = 0; i < m; ++ i)
		f2[b[i] + 1] += f2[b[i]], f2[b[i]] = 0;
	max2 = max1 + x;
	cout << max2 << '\n';
	for (int i = 1; i <= max2; ++ i)
		cout << f1[i] << ' ' << f2[i] << '\n';
	return 0;
}
posted @ 2023-08-17 21:09  Vitamin_B  阅读(13)  评论(0)    收藏  举报  来源