https://ac.nowcoder.com/acm/contest/3005/C
タイトル説明
所定数のn列の長さは、その長さの積は連続サブセグメントKモジュロ998244353の余りの最大値を求めています。
思考
対象は、支配者として採用するだけでなく、逆に0に注意を払うする必要があり、直接ツリーライン、接続された各製品のツリーラインのメンテナンス間隔として、最終的に最大の複数のクエリ、ノートの取り方を取ることができます
#include <bits/stdc++.h>
#pragma warning (disable:6031)
#pragma warning (disable:4996)
#define mem(a, b) memset(a, b, sizeof a);
using namespace std;
const int N = 2e5 + 10;
const int mod = 998244353;
typedef long long ll;
struct p {
int l, r;
ll multi_sum;
ll max_sum;
ll lsum, rsum;
};
struct SegementTree {
p c[N * 4];
void build(int l, int r, int k) {
c[k].l = l;
c[k].r = r;
c[k].multi_sum = 0;
c[k].max_sum = 0;
if (l == r) {
cin >> c[k].multi_sum;
c[k].max_sum = c[k].multi_sum;
c[k].lsum = c[k].rsum = c[k].multi_sum;
return ;
}
int mid = (l + r) / 2;
build(l, mid, k << 1);
build(mid + 1, r, k << 1 | 1);
c[k].lsum = c[k << 1].lsum;
c[k].rsum = c[k << 1 | 1].rsum;
c[k].lsum %= mod;
c[k].rsum %= mod;
if (c[k << 1].lsum == c[k << 1].multi_sum)c[k].lsum = c[k].lsum * c[k << 1 | 1].lsum;
if (c[k << 1 | 1].rsum == c[k << 1 | 1].multi_sum)c[k].rsum = c[k].rsum * (c[k << 1].rsum);
c[k].lsum %= mod;
c[k].rsum %= mod;
c[k].multi_sum = c[k << 1].multi_sum * c[k << 1 | 1].multi_sum;
c[k].multi_sum %= mod;
c[k].max_sum = max(c[k << 1].max_sum, c[k << 1 | 1].max_sum);
c[k].max_sum = max(c[k].max_sum, (c[k << 1].rsum * c[k << 1 | 1].lsum) % mod);
}
ll query(int l, int r, int k) {
if (c[k].l >= l && c[k].r <= r) {
return c[k].multi_sum % mod;
}
int mid = c[k].l + c[k].r;
mid /= 2;
ll res = 1;
if (l <= mid) {
res *= query(l, r, k << 1);
res %= mod;
}
if (r > mid) {
res *= query(l, r, k << 1 | 1);
res %= mod;
}
return res % mod;
}
};
SegementTree st;
int main()
{
ios::sync_with_stdio(0);
int n, k;
cin >> n >> k;
st.build(1, n, 1);
ll ans = -1;
for (int i = 1; i + k - 1 <= n; i++) {
ans = max(ans, st.query(i, i + k - 1, 1));
}
printf("%lld\n", ans);
return 0;
}