QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#708502 | #2998. 皮配 | TheZone | 100 ✓ | 497ms | 9908kb | C++20 | 4.2kb | 2024-11-03 23:01:14 | 2024-11-03 23:01:14 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2505, mod = 998244353;
int qmod(int x) { return x >= mod ? x - mod : x; }
template <typename T>
void read(T &x)
{
T sgn = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (x = 0; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
x *= sgn;
}
int C[2], D[2];
int n, m, c, b[maxn], s[maxn], t[maxn];
int f[maxn], g[maxn];
vector<int> vec[maxn];
int h[maxn][305], tmp[maxn][305];
int r[305], e[305], cnt[maxn];
int mark[maxn], ans;
void MAIN()
{
int tot = 0;
read(n); read(c);
for (int i = 1; i <= n; i++) mark[i] = -1;
for (int i = 1; i <= c; i++) t[i] = cnt[i] = 0, vec[i].clear();
read(C[0]); read(C[1]); read(D[0]); read(D[1]);
int M = max({C[0], C[1], D[0], D[1]});
for (int i = 1; i <= n; i++)
read(b[i]), read(s[i]), t[b[i]] += s[i], tot += s[i];
read(m);
for (int i = 1, j; i <= m; i++)
{
read(j); read(mark[j]);
vec[b[j]].push_back(j);
cnt[b[j]] += s[j];
}
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
memset(h, 0, sizeof(h));
f[0] = g[0] = h[0][0] = 1;
for (int i = 1; i <= c; i++) if (t[i] && vec[i].size() == 0)
for (int j = M; j >= t[i]; j--)
f[j] = qmod(f[j] + f[j - t[i]]);
for (int i = 1; i <= n; i++) if (mark[i] == -1)
for (int j = M; j >= s[i]; j--)
g[j] = qmod(g[j] + g[j - s[i]]);
for (int i = 1; i <= M; i++)
{
f[i] = qmod(f[i] + f[i - 1]);
g[i] = qmod(g[i] + g[i - 1]);
}
int lst = 0;
for (int i = 1; i <= c; i++) if (t[i] && vec[i].size())
{
memcpy(tmp, h, sizeof(tmp));
memset(h, 0, sizeof(h));
lst += cnt[i];
for (int o = 0; o < 2; o++)
{
memset(r, 0, sizeof(r));
r[0] = 1;
for (int j : vec[i])
{
memcpy(e, r, sizeof(e));
memset(r, 0, sizeof(r));
for (int k = 0; k <= cnt[i]; k++)
for (int p = 0; p < 2; p++) if (mark[j] != ((o << 1) | p))
{
if (k >= p * s[j]) r[k] = qmod(r[k] + e[k - p * s[j]]);
}
}
for (int j = 0; j <= M; j++) if (j >= o * t[i])
for (int k = 0; k <= lst; k++)
for (int l = 0; l <= cnt[i]; l++)
h[j][k] = qmod(h[j][k] + 1ll * tmp[j - o * t[i]][k - l] * r[l] % mod);
}
} ans = 0;
for (int i = 0; i <= M; i++)
{
for (int j = 0; j <= m * 10; j++) if (h[i][j])
{
int l = max(tot - C[0] - i, 0), r = C[1] - i;
if (l > r || r < 0) continue;
int v1 = qmod(f[r] - (l == 0 ? 0 : f[l - 1]) + mod);
l = max(tot - D[0] - j, 0), r = D[1] - j;
if (l > r || r < 0) continue;
int v2 = qmod(g[r] - (l == 0 ? 0 : g[l - 1]) + mod);
if (!v1 || !v2) continue;
ans = qmod(ans + 1ll * v1 * v2 % mod * h[i][j] % mod);
}
}
printf("%d\n", ans);
}
int main()
{
int T;
read(T);
while (T--) MAIN();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Pretests
Final Tests
Test #1:
score: 10
Accepted
time: 0ms
memory: 9720kb
input:
5 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 3
output:
3 4 3 3 3
result:
ok 5 lines
Test #2:
score: 10
Accepted
time: 13ms
memory: 9840kb
input:
5 10 10 100 100 100 100 2 9 7 10 3 10 3 10 6 10 4 10 2 10 6 10 1 10 10 10 10 7 0 8 3 5 1 4 2 6 1 3 0 1 2 10 0 2 1 9 2 10 10 100 100 100 99 6 10 7 10 5 10 5 10 10 10 5 10 2 9 3 6 7 10 3 10 5 10 2 6 3 4 2 7 0 3 1 10 10 96 100 100 8 3 10 9 10 2 10 3 10 3 10 2 10 3 8 9 5 2 10 3 10 5 9 3 10 1 8 0 1 1 6 2...
output:
5184 13824 8 7768 59049
result:
ok 5 lines
Test #3:
score: 10
Accepted
time: 0ms
memory: 7308kb
input:
5 20 20 93 93 100 97 6 3 19 7 6 10 2 7 5 6 11 7 4 10 17 10 1 7 19 4 14 5 20 7 15 3 6 7 5 6 15 10 3 7 5 10 15 6 1 7 0 20 20 100 100 100 100 20 10 7 9 2 8 5 10 4 6 1 10 4 10 17 10 1 6 5 10 12 10 9 6 12 8 1 10 10 10 13 10 12 10 10 10 13 7 18 10 0 20 20 98 96 100 10 3 5 8 5 19 7 3 6 19 5 3 6 5 4 6 5 6 3...
output:
826806650 477561084 85170 0 131405274
result:
ok 5 lines
Test #4:
score: 10
Accepted
time: 2ms
memory: 8624kb
input:
5 30 30 100 98 94 97 12 2 27 5 25 5 24 4 14 5 4 6 22 7 2 3 30 8 1 2 7 5 2 2 20 5 11 7 15 5 18 3 11 3 1 4 25 5 11 2 15 4 12 5 3 8 12 7 6 3 30 8 19 5 13 3 21 9 4 3 0 30 30 93 99 92 93 24 3 23 10 17 5 22 5 17 7 29 10 18 6 7 5 17 6 9 7 3 6 16 6 9 5 10 4 6 5 20 6 2 7 20 5 3 3 9 3 2 5 29 6 9 8 1 4 12 5 1 ...
output:
217399345 840927688 15230976 0 991268888
result:
ok 5 lines
Test #5:
score: 10
Accepted
time: 180ms
memory: 9772kb
input:
5 30 30 482 500 500 500 17 10 15 10 25 10 14 8 9 10 1 10 15 10 23 10 13 8 15 9 15 8 20 10 19 10 6 10 18 8 23 10 3 10 28 10 13 10 2 10 15 10 17 10 1 10 2 10 14 10 11 10 29 7 24 10 14 10 30 10 13 15 3 25 3 18 2 23 2 1 3 7 0 4 2 20 0 26 2 9 1 3 2 30 2 24 1 30 30 485 500 500 489 22 10 7 10 10 10 1 8 9 1...
output:
335527780 562018873 0 721419962 437550714
result:
ok 5 lines
Test #6:
score: 10
Accepted
time: 4ms
memory: 8152kb
input:
5 500 500 998 974 1000 975 427 4 84 3 313 2 161 4 371 2 481 4 5 3 80 2 156 6 448 4 424 2 302 1 277 1 14 2 343 6 431 2 452 3 369 3 427 2 245 6 413 3 317 3 1 3 447 1 337 4 181 2 224 5 243 3 494 2 248 3 152 5 430 4 119 4 290 2 19 3 93 2 274 4 14 2 67 2 56 2 75 5 454 3 407 1 324 3 138 5 283 4 274 4 472 ...
output:
444961978 726306306 604706636 0 591791292
result:
ok 5 lines
Test #7:
score: 10
Accepted
time: 164ms
memory: 9908kb
input:
5 500 30 1000 982 976 986 1 2 23 3 22 1 5 6 22 4 27 2 22 5 18 6 19 1 11 4 30 2 20 4 2 3 18 2 2 3 18 4 8 2 27 4 3 3 27 4 19 5 2 1 28 4 18 2 10 1 11 4 29 3 20 2 22 3 4 2 4 4 26 3 3 3 3 4 3 5 18 3 3 1 4 3 11 3 15 6 19 2 21 3 23 4 12 2 14 4 2 1 30 2 15 4 10 3 21 3 12 6 11 3 14 2 5 2 30 1 11 2 25 4 13 2 ...
output:
721598186 376511045 916295431 692157069 839818974
result:
ok 5 lines
Test #8:
score: 10
Accepted
time: 173ms
memory: 9860kb
input:
5 500 500 975 1000 1000 1000 322 4 4 1 327 6 287 3 352 3 493 3 8 4 89 1 348 3 277 2 158 2 375 2 457 3 155 2 94 2 423 2 407 4 405 2 474 4 44 2 103 3 430 4 61 2 83 2 314 2 143 5 468 2 481 3 241 2 388 4 453 3 301 3 225 4 375 2 181 5 259 5 220 4 126 3 301 4 150 1 383 1 394 3 177 1 329 4 448 1 394 3 129 ...
output:
139292860 233441301 292203931 490172452 532521263
result:
ok 5 lines
Test #9:
score: 10
Accepted
time: 14ms
memory: 8596kb
input:
5 1000 1000 2500 2500 2500 2500 285 3 51 3 740 5 140 4 758 4 740 2 493 7 155 3 30 6 380 2 235 3 447 5 500 4 402 2 358 2 936 4 48 4 793 4 994 1 668 5 607 3 694 4 426 4 377 7 314 7 83 7 948 3 423 6 229 4 920 3 498 5 262 3 22 4 25 3 661 4 420 2 689 5 509 5 401 3 213 4 286 4 699 3 466 4 430 3 734 4 420 ...
output:
803471990 878872778 65626616 0 143791691
result:
ok 5 lines
Test #10:
score: 10
Accepted
time: 497ms
memory: 9816kb
input:
5 1000 1000 2500 2500 2500 2500 801 5 102 2 581 5 589 5 493 6 214 2 604 10 391 3 7 2 555 4 594 3 614 8 230 5 900 4 605 5 869 6 991 4 820 2 124 4 630 2 694 3 244 6 170 4 8 2 360 1 394 3 512 7 823 3 89 3 988 5 433 4 858 6 362 4 995 4 181 3 718 3 275 2 325 4 11 4 5 2 222 4 209 5 562 1 158 2 908 3 496 3...
output:
517838564 14120732 890567148 196568551 60485305
result:
ok 5 lines
Extra Test:
score: 0
Extra Test Passed