打卡信奥刷题(3415)用C++实现信奥题 P10143 [WC2024] 代码堵塞

P10143 [WC2024] 代码堵塞

题目描述

ℶ\beth 为了纪念停办的 codejam,准备了一场“代码堵塞纪念赛”。小 ℶ\beth 的朋友小 ℧\mho 也来围观,于是小 ℶ\beth 想预测小 ℧\mho 的成绩。

比赛共 TTT 秒,有 nnn 道题。第 i(1≤i≤n)i(1 \le i \le n)i(1in) 题分数为 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 解释

我们用长度为 333010101 序列表示题目类型,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 2001n200
  • 1≤T≤3×1051\le T\le 3\times 10^51T3×105
  • ∀1≤i≤n,1≤ai≤3×105\forall 1\le i\le n , 1\le a_i\le 3\times 10^5∀1in,1ai3×105
  • ∀1≤i≤n,1≤ti≤T\forall 1\le i\le n, 1\le t_i\le T∀1in,1tiT
测试点编号$n\le $$T\le $特殊性质 A特殊性质 B
1∼41\sim 41415151510210^2102
5∼75\sim 7572002002003×1053\times 10^53×105
8,98,98,92002002003×1053\times 10^53×105
10∼1310\sim 1310132002002003×1053\times 10^53×105
14∼1614\sim 16141650505010310^3103
17,1817,1817,1810210^210210410^4104
19,2019,2019,202002002003×1053\times 10^53×105
  • 特殊性质 A:∀1≤i≤n,ai=1\forall 1 \le i \le n, a_i = 1∀1in,ai=1
  • 特殊性质 B:∀1≤i≤n,ti=1\forall 1 \le i \le n, t_i = 1∀1in,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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值