P10143 [WC2024] 代码堵塞
题目描述
小 ℶ\bethℶ 为了纪念停办的 codejam,准备了一场“代码堵塞纪念赛”。小 ℶ\bethℶ 的朋友小 ℧\mho℧ 也来围观,于是小 ℶ\bethℶ 想预测小 ℧\mho℧ 的成绩。
比赛共 TTT 秒,有 nnn 道题。第 i(1≤i≤n)i(1 \le i \le n)i(1≤i≤n) 题分数为 aia_iai,小 ℶ\bethℶ 预测小 ℧\mho℧ 需要 tit_iti 秒完成。
题目有两种类型:结果可见和结果不可见。结果不可见的题在比赛结束后才能知道评测结果,而结果可见的题在提交后立即得到评测结果。小 ℶ\bethℶ 还没确定每道题的类型。
小 ℧\mho℧ 由于从不写对拍,所以会先按编号从小到大完成所有结果可见的题,再按编号从小到大完成所有结果不可见的题。小 ℧\mho℧ 会花 tit_iti 秒完成第 iii 题,当小 ℧\mho℧ 花费在第 iii 题和在第 iii 题之前完成的所有题的时间总和不超过 TTT,就会在第 iii 题产生提交。
由于小 ℧\mho℧ 提交即 AC,所以小 ℶ\bethℶ 想知道对于所有 2n2^n2n 种确定 nnn 道题类型的方案,小 ℧\mho℧ 所能得到的分数总和的和。由于答案很大,你需要将答案对 998244353998244353998244353 取模。
输入格式
输入的第一行包含三个整数 c,n,Tc, n, Tc,n,T,表示测试点编号,题数和比赛时间。样例中的 ccc 表示其满足的限制条件与第 ccc 个测试点一致。
输入的第二行包含 nnn 个整数 a1,a2,⋯ ,ana_1, a_2, \cdots , a_na1,a2,⋯,an,分别表示每道题的分数。
输入的第三行包含 nnn 个整数 t1,t2,⋯ ,tnt_1, t_2, \cdots , t_nt1,t2,⋯,tn,分别表示小 ℧\mho℧ 做每道题的时间。
输出格式
输出一行包含一个整数,表示对于所有确定 nnn 道题类型的方案,小 ℧\mho℧ 所能得到的分数总和的和,对 998244353998244353998244353 取模。
输入输出样例 #1
输入 #1
1 3 3
2 3 4
1 2 2
输出 #1
40
说明/提示
样例 1 解释
我们用长度为 333 的 010101 序列表示题目类型,111 表示结果可见,000 表示结果不可见。
- (0,0,0)(1,0,0)(1,1,0)(1,1,1)(0, 0, 0)(1, 0, 0)(1, 1, 0)(1, 1, 1)(0,0,0)(1,0,0)(1,1,0)(1,1,1) 四种情况:小 ℧\mho℧ 按照编号顺序做题,前两题产生提交,分数和为 555;
- (0,1,0)(0, 1, 0)(0,1,0):小 ℧\mho℧ 按照 213213213 的顺序做题,前两题产生提交,分数和为 555;
- (0,0,1)(0, 0, 1)(0,0,1):小 ℧\mho℧ 按照 312312312 的顺序做题,第一题和第三题产生提交,分数和为 666;
- (1,0,1)(1, 0, 1)(1,0,1):小 ℧\mho℧ 按照 132132132 的顺序做题,第一题和第三题产生提交,分数和为 666;
- (0,1,1)(0, 1, 1)(0,1,1):小 ℧\mho℧ 按照 231231231 的顺序做题,只有第二题产生提交,分数和为 333。
因此答案为 (5×4+5+6+6+3) mod 998244353=40(5 \times 4 + 5 + 6 + 6 + 3) \bmod 998244353 = 40(5×4+5+6+6+3)mod998244353=40。
数据范围
对于所有测试数据:
- 1≤n≤2001\le n\le 2001≤n≤200,
- 1≤T≤3×1051\le T\le 3\times 10^51≤T≤3×105,
- ∀1≤i≤n,1≤ai≤3×105\forall 1\le i\le n , 1\le a_i\le 3\times 10^5∀1≤i≤n,1≤ai≤3×105,
- ∀1≤i≤n,1≤ti≤T\forall 1\le i\le n, 1\le t_i\le T∀1≤i≤n,1≤ti≤T。
| 测试点编号 | $n\le $ | $T\le $ | 特殊性质 A | 特殊性质 B |
|---|---|---|---|---|
| 1∼41\sim 41∼4 | 151515 | 10210^2102 | 否 | 否 |
| 5∼75\sim 75∼7 | 200200200 | 3×1053\times 10^53×105 | 是 | 是 |
| 8,98,98,9 | 200200200 | 3×1053\times 10^53×105 | 是 | 否 |
| 10∼1310\sim 1310∼13 | 200200200 | 3×1053\times 10^53×105 | 否 | 是 |
| 14∼1614\sim 1614∼16 | 505050 | 10310^3103 | 否 | 否 |
| 17,1817,1817,18 | 10210^2102 | 10410^4104 | 否 | 否 |
| 19,2019,2019,20 | 200200200 | 3×1053\times 10^53×105 | 否 | 否 |
- 特殊性质 A:∀1≤i≤n,ai=1\forall 1 \le i \le n, a_i = 1∀1≤i≤n,ai=1。
- 特殊性质 B:∀1≤i≤n,ti=1\forall 1 \le i \le n, t_i = 1∀1≤i≤n,ti=1。
后记
“你们这比赛怎么所有题都结果不可见啊?”
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e2 + 10;
const int MAXM = 3e5 + 10;
const int mod = 998244353;
int n, m, a[MAXN], t[MAXN];
ll dp[MAXM], p2[MAXM], sum[MAXM], ans, tot;
int main() {
scanf("%*d%d%d", &n, &m), *dp = *p2 = 1;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &t[i]), sum[i] = sum[i - 1] + t[i];
for (int i = 1; i <= n; i++)
p2[i] = p2[i - 1] * 2 % mod;
for (int i = 1; i <= n; i++) {
tot = 0;
for (int j = 0; j <= m - t[i]; j++)
tot = (tot + dp[j]) % mod;
ans = (ans + tot * p2[n - i] % mod * a[i]) % mod;
for (int j = m; j >= t[i]; j--)
dp[j] = (dp[j] + dp[j - t[i]]) % mod;
}
for (int i = 0; i <= m; i++) dp[i] = 0; *dp = 1;
for (int i = n; i; i--) {
tot = 0;
for (int j = 0; j <= m - sum[i]; j++) tot = (tot + dp[j]) % mod;
ans = (ans + tot * p2[i - 1] % mod * a[i]) % mod;
for (int j = m; j >= t[i]; j--) dp[j] = (dp[j] + dp[j - t[i]]) % mod;
}
printf("%lld", ans);
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
448

被折叠的 条评论
为什么被折叠?



