QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#71819 | #2998. 皮配 | He_Ren | 100 ✓ | 37ms | 9808kb | C++23 | 5.3kb | 2023-01-12 01:24:03 | 2023-01-12 01:24:24 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAXN = 1e3 + 5;
const int MAXM = 2.5e3 + 5;
const int MAXS = 3e2 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
inline void add_mod(int &a, int b) {
a += b;
if (a >= mod)
a -= mod;
}
struct Bagdp {
int dp[MAXM], C0, C1, sum;
void init(int _C0, int _C1) {
C0 = _C0;
C1 = _C1;
memset(dp, 0, (C0 + 1) << 2);
dp[0] = 1;
sum = 0;
}
void insert(int x) {
int mni = max(0, sum - C1);
int mxi = min(sum, C0 - x);
for (int i = mxi; i >= mni; --i)
add_mod(dp[i + x], dp[i]);
sum += x;
for (int i = mni; i < sum - C1; ++i)
dp[i] = 0;
}
};
int c[MAXN], a[MAXN], fob[MAXN];
void solve(void) {
int n, d;
int C0, C1, D0, D1;
scanf("%d%*d%d%d%d%d", &n, &C0, &C1, &D0, &D1);
for (int i = 1; i <= n; ++i)
scanf("%d%d", &c[i], &a[i]);
memset(fob, -1, (n + 1) << 2);
scanf("%d", &d);
for (int i = 1; i <= d; ++i) {
int x, y;
scanf("%d%d", &x, &y);
fob[x] = y;
}
static vector<int> pt[MAXN];
static int suma[MAXN];
fill(pt + 1, pt + n + 1, vector<int>());
memset(suma, 0, (n + 1) << 2);
for (int i = 1; i <= n; ++i) {
suma[c[i]] += a[i];
if (fob[i] != -1)
pt[c[i]].push_back(i);
}
for (int i = 1; i <= n; ++i)
if (suma[i] > max(C0, C1)) {
printf("0\n");
return;
}
if (accumulate(suma + 1, suma + n + 1, 0) > min(C0 + C1, D0 + D1)) {
printf("0\n");
return;
}
static Bagdp bagC, bagD;
bagC.init(C0, C1);
bagD.init(D0, D1);
for (int k = 1; k <= n; ++k)
if (suma[k] && !pt[k].size())
bagC.insert(suma[k]);
for (int i = 1; i <= n; ++i)
if (fob[i] == -1)
bagD.insert(a[i]);
static int dp[2][MAXM][MAXS];
memset(dp, 0, sizeof(dp));
int now = 0;
dp[now][0][0] = 1;
int sumC = 0, sumD = 0;
for (int k = 1; k <= n; ++k)
if (pt[k].size()) {
memset(dp[now ^ 1], 0, sizeof(dp[now ^ 1]));
for (int t = 0; t <= 1; ++t) {
if (suma[k] > (t == 0 ? C0 : C1))
continue;
static Bagdp curbag;
curbag.init(D0, D1);
int must[2] = {0, 0};
for (int u : pt[k]) {
if (((fob[u] >> 1) & 1) == t)
must[!(fob[u] & 1)] += a[u];
else
curbag.insert(a[u]);
}
vector<pii> may;
for (int i = 0; i <= D0 && i <= curbag.sum; ++i)
if (i + must[0] <= D0 && curbag.sum - i + must[1] <= D1) {
if (!curbag.dp[i])
continue;
may.emplace_back(i + must[0], curbag.dp[i]);
}
int mnC = max(0, sumC - C1), mxC = min(sumC, C0);
int mnD = max(0, sumD - D1), mxD = min(sumD, D0);
for (int i = mnC; i <= mxC; ++i) {
int ii = i + (t == 0 ? suma[k] : 0);
if (ii > C0)
break;
for (int j = mnD; j <= mxD; ++j)
if (dp[now][i][j])
for (pii it : may) {
if (j + it.first > D0)
break;
add_mod(dp[now ^ 1][ii][j + it.first], (ll)dp[now][i][j] * it.second % mod);
}
}
}
sumC += suma[k];
for (int u : pt[k])
sumD += a[u];
now ^= 1;
}
static int dpC[MAXM], dpD[MAXM];
memcpy(dpC, bagC.dp, (C0 + 1) << 2);
memcpy(dpD, bagD.dp, (D0 + 1) << 2);
for (int i = 1; i <= C0; ++i)
add_mod(dpC[i], dpC[i - 1]);
for (int i = 1; i <= D0; ++i)
add_mod(dpD[i], dpD[i - 1]);
auto getC = [&](int l, int r) {
l = max(l, 0);
r = min(r, C0);
if (l > r)
return 0;
return l == 0 ? dpC[r] : (dpC[r] - dpC[l - 1] + mod) % mod;
};
auto getD = [&](int l, int r) {
l = max(l, 0);
r = min(r, D0);
if (l > r)
return 0;
return l == 0 ? dpD[r] : (dpD[r] - dpD[l - 1] + mod) % mod;
};
int ans = 0;
for (int i = 0; i <= C0 && i <= sumC; ++i)
if (sumC - i <= C1)
for (int j = 0; j <= D0 && j <= sumD; ++j)
if (sumD - j <= D1) {
if (!dp[now][i][j])
continue;
int LC = sumC + bagC.sum - C1 - i, RC = C0 - i;
int LD = sumD + bagD.sum - D1 - j, RD = D0 - j;
add_mod(ans, (ll)dp[now][i][j] * getC(LC, RC) % mod * getD(LD, RD) % mod);
}
printf("%d\n", ans);
}
int main(void) {
int T;
scanf("%d", &T);
while (T--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 10
Accepted
time: 6ms
memory: 9700kb
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: 3ms
memory: 9660kb
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: 5ms
memory: 9644kb
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: 5ms
memory: 9732kb
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: 13ms
memory: 9660kb
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: 2ms
memory: 9712kb
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: 37ms
memory: 9724kb
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: 33ms
memory: 9792kb
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: 7ms
memory: 9700kb
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: 34ms
memory: 9808kb
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