QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#270241 | #2998. 皮配 | yhk1001 | 100 ✓ | 211ms | 33884kb | C++14 | 4.7kb | 2023-11-30 17:00:59 | 2023-11-30 17:00:59 |
Judging History
answer
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const long long P = 998244353;
const int N = 1000;
int n, c;
int C[5], D[5];
int special;
struct School {
int city, student, dislike;
}a[N + 5], b[N + 5];
const int M = 2500;
long long f[M + 5], g[M + 5];
long long preF[M + 5], preG[M + 5];
int box[N + 5];
bool hate[N + 5];
void calcF()//city only
{
f[0] = 1;
for (int i = 1, sum = 0; i <= c; i++)
{
if (!box[i] || hate[i])
continue;
sum += box[i];
for (int j = C[0]; j >= 0; j--)
{
if (sum - j > C[1])
{
f[j] = 0;
continue;
}
if (j >= box[i])
f[j] = (f[j] + f[j - box[i]]) % P;
}
}
preF[0] = f[0];
for (int i = 1; i <= C[0]; i++)
preF[i] = (preF[i - 1] + f[i]) % P;
return ;
}
void calcG()//school only
{
g[0] = 1;
for (int i = 1, sum = 0; i <= n; i++)
{
if (a[i].dislike != -1)
continue;
sum += a[i].student;
for (int j = D[0]; j >= 0; j--)
{
if (sum - j > D[1])
{
g[j] = 0;
continue;
}
if (j >= a[i].student)
g[j] = (g[j] + g[j - a[i].student]) % P;
}
}
preG[0] = g[0];
for (int i = 1; i <= D[0]; i++)
preG[i] = (preG[i - 1] + g[i]) % P;
return ;
}
long long getSum(int l, int r, long long v[])
{
if (l > r)
return 0;
if (l <= 0)
return v[r];
return (v[r] - v[l - 1] + P) % P;
}
const int K = 30, Max = 300;
long long dp[2][2][M + 5][Max + 5];
long long Combine[M + 5][Max + 5];
bool cmp(School A, School B)
{
return A.city < B.city;
}
void calcDP()
{
sort(b + 1, b + special + 1, cmp);
int sum = 0, p = 0;
dp[0][0][0][0] = 1;
for (int i = 1; i <= special; i++)
{
sum += b[i].student;
bool ChangeCity = (b[i - 1].city != b[i].city);
for (int j = 0; j <= C[0]; j++)
for (int k = 0; k <= min(D[0], sum); k++)
{
if (b[i].dislike != 0)
{
if (ChangeCity && j >= box[b[i].city] && k >= b[i].student)
{
dp[p ^ 1][0][j][k] = (dp[p ^ 1][0][j][k] + dp[p][0][j - box[b[i].city]][k - b[i].student]
+ dp[p][1][j - box[b[i].city]][k - b[i].student]) % P;
}
if (!ChangeCity && k >= b[i].student)
{
dp[p ^ 1][0][j][k] = (dp[p ^ 1][0][j][k] + dp[p][0][j][k - b[i].student]) % P;
}
}
if (b[i].dislike != 1)
{
if (ChangeCity && j >= box[b[i].city])
{
dp[p ^ 1][0][j][k] = (dp[p ^ 1][0][j][k] + dp[p][0][j - box[b[i].city]][k]
+ dp[p][1][j - box[b[i].city]][k]) % P;
}
if (!ChangeCity)
{
dp[p ^ 1][0][j][k] = (dp[p ^ 1][0][j][k] + dp[p][0][j][k]) % P;
}
}
if (b[i].dislike != 2)
{
if (ChangeCity && k >= b[i].student)
{
dp[p ^ 1][1][j][k] = (dp[p ^ 1][1][j][k] + dp[p][0][j][k - b[i].student]
+ dp[p][1][j][k - b[i].student]) % P;
}
if (!ChangeCity && k >= b[i].student)
{
dp[p ^ 1][1][j][k] = (dp[p ^ 1][1][j][k] + dp[p][1][j][k - b[i].student]) % P;
}
}
if (b[i].dislike != 3)
{
if (ChangeCity)
{
dp[p ^ 1][1][j][k] = (dp[p ^ 1][1][j][k] + dp[p][0][j][k]
+ dp[p][1][j][k]) % P;
}
if (!ChangeCity)
{
dp[p ^ 1][1][j][k] = (dp[p ^ 1][1][j][k] + dp[p][1][j][k]) % P;
}
}
}
for (int j = 0; j <= C[0]; j++)
for (int k = 0; k <= min(D[0], sum); k++)
dp[p][0][j][k] = dp[p][1][j][k] = 0;
p ^= 1;
}
for (int i = 0; i <= C[0]; i++)
for (int j = 0; j <= min(D[0], sum); j++)
Combine[i][j] = (dp[p][0][i][j] + dp[p][1][i][j]) % P;
return ;
}
void solve()
{
int sum = 0;
scanf("%d%d", &n, &c);
scanf("%d%d%d%d", &C[0], &C[1], &D[0], &D[1]);
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i].city, &a[i].student);
a[i].dislike = -1;
sum += a[i].student;
box[a[i].city] += a[i].student;
}
scanf("%d", &special);
for (int i = 1, pos; i <= special; i++)
{
scanf("%d", &pos);
scanf("%d", &a[pos].dislike);
b[i] = a[pos];
hate[b[i].city] = 1;
}
calcF();
calcG();
calcDP();
long long ans = 0;
for (int i = 0; i <= C[0]; i++)
for (int j = 0; j <= min(D[0], Max); j++)
{
long long F = getSum(sum - i - C[1], C[0] - i, preF);
long long G = getSum(sum - j - D[1], D[0] - j, preG);
ans = (ans + F * G % P * Combine[i][j] % P) % P;
}
printf("%lld\n", ans);
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
memset(preF, 0, sizeof(preF));
memset(preG, 0, sizeof(preG));
memset(dp, 0, sizeof(dp));
memset(Combine, 0, sizeof(Combine));
memset(box, 0, sizeof(box));
memset(hate, 0, sizeof(hate));
return ;
}
int main()
{
// #define HACK
#ifdef HACK
freopen("data.in", "r", stdin);
freopen("mycode.out", "w", stdout);
#endif
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: 7ms
memory: 33876kb
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: 33736kb
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: 8ms
memory: 33784kb
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: 4ms
memory: 33740kb
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: 35ms
memory: 33884kb
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: 12ms
memory: 33872kb
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: 71ms
memory: 33884kb
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: 69ms
memory: 33880kb
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: 47ms
memory: 33804kb
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: 211ms
memory: 33720kb
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