結果
問題 | No.2215 Slide Subset Sum |
ユーザー |
![]() |
提出日時 | 2023-02-10 22:08:49 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,720 bytes |
コンパイル時間 | 2,984 ms |
コンパイル使用メモリ | 223,992 KB |
実行使用メモリ | 175,364 KB |
最終ジャッジ日時 | 2024-07-07 16:23:06 |
合計ジャッジ時間 | 11,217 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 2 |
other | AC * 2 TLE * 1 -- * 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 = atcoder::convolution(A, B);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]);}}}