QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#536450#8049. Equal Sumsucup-team3591#ML 1ms5796kbC++202.0kb2024-08-29 13:01:162024-08-29 13:01:16

Judging History

你现在查看的是最新测评结果

  • [2024-08-29 13:01:16]
  • 评测
  • 测评结果:ML
  • 用时:1ms
  • 内存:5796kb
  • [2024-08-29 13:01:16]
  • 提交

answer

// Code by Heratino & Nelofus
// 消えたくって 羽ばたいて 今
// 消えたくなくなった
// 摘み取って残した ここでいつか 華咲かせる
// 消えたかった 私はもういない
// 消えなくてよかったな…
// だって君と出会い 芽吹いてしまった 運命の華
#include <bits/stdc++.h>
using i64 = long long;
using f64 = double;

//{{{
template<typename Ta, typename Tb>
inline void chkmax(Ta &a, const Tb &b) {if (a < b)	a = b;}
template<typename Ta, typename Tb>
inline void chkmin(Ta &a, const Tb &b) {if (a > b)	a = b;}
//}}}

constexpr int N = 510;
constexpr int V = 500;
constexpr int mod = 998244353;
inline int Add(const int &x, const int &y) {return x + y >= mod ? x + y - mod : x + y;}
inline int Sub(const int &x, const int &y) {return x - y < 0 ? x - y + mod : x - y;}

int n, m;
int f[N][N][2 * N], g[N][N][2 * N];
int xl[N], xr[N], yl[N], yr[N];

inline void do_prefix(int x, int y) {
	for (int i = N + V; i >= N - V; i--)
		g[x][y][i] = Add(f[x][y][i], g[x][y][i + 1]);
}
inline int segval(int x, int y, int l, int r) {
	if (l > r)
		return 0;
	return Sub(g[x][y][l], g[x][y][r + 1]);
}

int main() {
#ifdef HeratinoNelofus
	freopen("input.txt", "r", stdin);
#endif
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	std::cin >> n >> m;
	for (int i = 1; i <= n; i++)
		std::cin >> xl[i] >> xr[i];
	for (int i = 1; i <= m; i++)
		std::cin >> yl[i] >> yr[i];
	f[0][0][N] = 1;
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= m; j++) {
			do_prefix(i, j);
			for (int k = N - V; k <= N + V; k++) {
				if (j + 1 <= m)
					f[i][j + 1][k] = Add(f[i][j + 1][k], segval(i, j, std::max(N + 1, k + yl[j + 1]), std::min(V + N, k + yr[j + 1])));
				if (i + 1 <= n)
					f[i + 1][j][k] = Add(f[i + 1][j][k], segval(i, j, std::max(N - V, k - xr[i + 1]), std::min(N, k - xl[i + 1])));
			}
		}
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			std::cout << f[i][j][N] << " \n"[j == m];
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 5796kb

input:

2 3
1 2
2 3
1 4
2 2
1 3

output:

2 0 0
3 4 4

result:

ok 6 numbers

Test #2:

score: -100
Memory Limit Exceeded

input:

500 500
19 458
1 480
7 485
50 461
12 476
15 461
48 466
40 453
46 467
9 458
27 478
26 472
46 459
29 490
6 500
17 487
48 484
28 472
28 459
25 480
4 491
29 481
36 460
2 491
44 499
22 473
20 458
4 483
27 471
2 496
11 461
43 450
2 478
37 466
15 459
42 482
7 451
19 455
2 453
47 475
48 450
1 474
46 471
9 4...

output:

411 79401 9145270 673005095 180581065 984223118 586589234 293043270 404363796 865361724 665487988 118838806 926189944 226338288 521479857 808644951 786041288 340769021 177100 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result: