結果
| 問題 |
No.2215 Slide Subset Sum
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2023-02-10 22:10:08 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,845 bytes |
| コンパイル時間 | 3,298 ms |
| コンパイル使用メモリ | 214,308 KB |
| 実行使用メモリ | 168,072 KB |
| 最終ジャッジ日時 | 2024-07-07 16:24:15 |
| 合計ジャッジ時間 | 12,681 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 2 |
| other | AC * 1 TLE * 2 -- * 42 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/convolution>
using namespace std;
const long long MOD = 998244353;
template <typename T>
struct sliding_window_aggregation{
function<T(T, T)> f;
T E;
stack<pair<T, T>> fr, bk;
sliding_window_aggregation(function<T(T, T)> f, T E): f(f), E(E){
}
void push(T x){
if (fr.empty()){
fr.push(make_pair(x, x));
} else {
fr.push(make_pair(x, f(fr.top().second, x)));
}
}
void pop(){
if (bk.empty()){
while (!fr.empty()){
T x = fr.top().first;
fr.pop();
if (bk.empty()){
bk.push(make_pair(x, x));
} else {
bk.push(make_pair(x, f(x, bk.top().second)));
}
}
}
bk.pop();
}
T get(){
T ans1 = E;
if (!fr.empty()){
ans1 = fr.top().second;
}
T ans2 = E;
if (!bk.empty()){
ans2 = bk.top().second;
}
return f(ans2, ans1);
}
};
int main(){
int N, M, K;
cin >> N >> M >> K;
vector<int> A(N);
for (int i = 0; i < N; i++){
cin >> A[i];
}
vector<vector<long long>> B(N, vector<long long>(K, 0));
for (int i = 0; i < N; i++){
B[i][0]++;
B[i][A[i]]++;
}
auto op = [&](vector<long long> A, vector<long long> B){
vector<long long> C(K * 2 - 1, 0);
for (int i = 0; i < K; i++){
for (int j = 0; j < K; j++){
C[i + j] += A[i] * B[j];
C[i + j] %= MOD;
}
}
for (int i = K; i < K * 2 - 1; i++){
C[i - K] += C[i];
C[i - K] %= MOD;
}
C.resize(K);
return C;
};
vector<long long> E(K, 0);
E[0] = 1;
sliding_window_aggregation<vector<long long>> S(op, E);
for (int i = 0; i < M; i++){
S.push(B[i]);
}
for (int i = 0; i <= N - M; i++){
cout << (S.get()[0] + MOD - 1) % MOD << endl;
if (i < N - M){
S.pop();
S.push(B[i + M]);
}
}
}
SSRS