結果
| 問題 | No.3391 Line up Dominoes |
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2026-01-03 00:46:20 |
| 言語 | C++17(gcc12) (gcc 12.4.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 846 ms / 3,000 ms |
| コード長 | 1,683 bytes |
| 記録 | |
| コンパイル時間 | 3,473 ms |
| コンパイル使用メモリ | 214,288 KB |
| 実行使用メモリ | 7,852 KB |
| 最終ジャッジ日時 | 2026-01-03 00:46:42 |
| 合計ジャッジ時間 | 21,962 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
static const long long MOD = 998244353;
tuple<int,int,int> find_interval(const vector<long long>& a,
long long lo, long long hi) {
if (a.empty() || lo > a.back() || hi < a.front()) {
return {0, -1, -1};
}
int l = lower_bound(a.begin(), a.end(), lo) - a.begin();
int r = upper_bound(a.begin(), a.end(), hi) - a.begin() - 1;
if (l > r) return {0, -1, -1};
return {r - l + 1, l, r};
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
long long K;
cin >> N >> M >> K;
vector<long long> A(N);
for (int i = 0; i < N; i++) cin >> A[i];
sort(A.begin(), A.end());
vector<int> l_inds(N), r_inds(N);
for (int i = 0; i < N; i++) {
auto [cnt, l, r] = find_interval(A, A[i] - K, A[i] + K);
l_inds[i] = l;
r_inds[i] = r;
}
vector<long long> dp(N, 1), pp(N);
for (int iter = 0; iter < M - 1; iter++) {
fill(pp.begin(), pp.end(), 0);
swap(dp, pp);
vector<long long> acc(N);
acc[0] = pp[0] % MOD;
for (int i = 1; i < N; i++) {
acc[i] = (acc[i - 1] + pp[i]) % MOD;
}
for (int j = 0; j < N; j++) {
int l = l_inds[j];
int r = r_inds[j];
if (l != -1) {
long long val = acc[r];
if (l > 0) val = (val - acc[l - 1] + MOD) % MOD;
dp[j] = (dp[j] + val) % MOD;
}
}
}
long long ans = 0;
for (int i = 0; i < N; i++) {
ans = (ans + dp[i]) % MOD;
}
cout << ans << '\n';
return 0;
}
norioc