QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#674028 | #2998. 皮配 | propane | 80 | 1568ms | 28240kb | C++20 | 6.0kb | 2024-10-25 13:15:47 | 2024-10-25 13:15:47 |
Judging History
answer
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
using LL = long long;
const int mod = 998244353;
void add(int &a, int b){
a += b;
if (a >= mod) a -= mod;
}
void sub(int &a, int b){
a -= b;
if (a < 0) a += mod;
}
int mul(int a, int b){
return 1LL * a * b % mod;
}
int s[2505][2505];
int get(int x1, int y1, int x2, int y2){
if (x1 > x2 or y1 > y2) return 0;
int ans = s[x2][y2];
if (x1 - 1 >= 0) sub(ans, s[x1 - 1][y2]);
if (y1 - 1 >= 0) sub(ans, s[x2][y1 - 1]);
if (x1 - 1 >= 0 and y1 - 0 >= 0) add(ans, s[x1 - 1][y1 - 1]);
return ans;
}
int main(){
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int T;
cin >> T;
while(T--){
int n, c;
cin >> n >> c;
int c0, c1, d0, d1;
cin >> c0 >> c1 >> d0 >> d1;
const int m = max({c0, c1, d0, d1});
vector<vector<int> > pos(c + 1);
vector<pair<int, int> > p(n);
vector<bool> st(c + 1);
for(int i = 0; i < n; i++){
cin >> p[i].first >> p[i].second;
pos[p[i].first].push_back(i);
}
int k;
cin >> k;
vector<pair<int, int> > q(k);
vector<int> v(n, -1);
for(int i = 0; i < k; i++){
int a, b;
cin >> a >> b;
a--;
v[a] = b;
st[p[a].first] = true;
}
int sum = 0;
vector<vector<int> > dp(1, vector<int>(1));
dp[0][0] = 1;
vector<int> f1(1), f2(1);
f1[0] = f2[0] = 1;
int sum2 = 0;
for(int i = 1; i <= c; i++){
if (pos[i].empty()) continue;
if (st[i]){
int t = 0;
for(auto id : pos[i]){
t += p[id].second;
}
vector<vector<int> > ndp(min(sum + t, m) + 1, vector<int>(min(sum + t, m) + 1));
// 选择阵营0
{
int cur = 0;
vector<int> f(1);
f[0] = 1;
for(auto id : pos[i]){
int k = p[id].second;
vector<int> nf(min(cur + k, m) + 1);
for(int j = 0; j < f.size(); j++){
if (v[id] != 0 and j + k < nf.size()) add(nf[j + k], f[j]);
if (v[id] != 1) add(nf[j], f[j]);
}
f.swap(nf);
cur += k;
}
for(int j = 0; j < f.size(); j++){
for(int a = 0; a + cur < ndp.size() and a < dp.size(); a++){
for(int b = 0; b + j < ndp[0].size() and b < dp[0].size(); b++){
add(ndp[a + cur][b + j], mul(dp[a][b], f[j]));
}
}
}
}
// 选择阵营1
{
int cur = 0;
vector<int> f(1);
f[0] = 1;
for(auto id : pos[i]){
int k = p[id].second;
vector<int> nf(min(cur + k, m) + 1);
for(int j = 0; j < f.size(); j++){
if (v[id] != 2 and j + k < nf.size()) add(nf[j + k], f[j]);
if (v[id] != 3) add(nf[j], f[j]);
}
f.swap(nf);
cur += k;
}
for(int j = 0; j < f.size(); j++){
for(int a = 0; a < dp.size(); a++){
for(int b = 0; b + j < ndp[0].size() and b < dp[0].size(); b++){
add(ndp[a][b + j], mul(dp[a][b], f[j]));
}
}
}
}
dp.swap(ndp);
sum += t;
}
else{
int t = 0;
for(auto id : pos[i]){
t += p[id].second;
}
{
vector<int> nf1(min(sum2 + t, m) + 1);
for(int j = 0; j < f1.size(); j++){
add(nf1[j], f1[j]);
if (j + t < nf1.size()) add(nf1[j + t], f1[j]);
}
f1.swap(nf1);
}
for(auto id : pos[i]){
int k = p[id].second;
vector<int> nf2(min(sum2 + k, m) + 1);
for(int j = 0; j < f2.size(); j++){
add(nf2[j], f2[j]);
if (j + k < nf2.size()) add(nf2[j + k], f2[j]);
}
f2.swap(nf2);
sum2 += k;
}
}
}
for(int i = 0; i < f1.size(); i++){
for(int j = 0; j < f2.size(); j++){
s[i][j] = mul(f1[i], f2[j]);
if (i - 1 >= 0) add(s[i][j], s[i - 1][j]);
if (j - 1 >= 0) add(s[i][j], s[i][j - 1]);
if (i - 1 >= 0 and j - 1 >= 0) sub(s[i][j], s[i - 1][j - 1]);
}
}
int tot = sum + sum2;
int ans = 0;
for(int i = 0; i < dp.size(); i++){
for(int j = 0; j < dp[0].size(); j++){
// i + a \in [tot - c1, c0]
// j + b \in [tot - d1, d0]
int l1 = max(0, tot - c1 - i);
int r1 = min(int(f1.size()) - 1, c0 - i);
int l2 = max(0, tot - d1 - j);
int r2 = min(int(f2.size()) - 1, d0 - j);
add(ans, mul(dp[i][j], get(l1, l2, r1, r2)));
}
}
cout << ans << '\n';
}
}
Details
Tip: Click on the bar to expand more detailed information
Pretests
Final Tests
Test #1:
score: 10
Accepted
time: 0ms
memory: 3600kb
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: 5ms
memory: 4028kb
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: 3980kb
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: 1ms
memory: 5896kb
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: 56ms
memory: 6508kb
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: 22ms
memory: 13320kb
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: 0
Time Limit Exceeded
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:
result:
Test #8:
score: 10
Accepted
time: 1568ms
memory: 22104kb
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: 125ms
memory: 28240kb
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: 0
Time Limit Exceeded
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...