线段树的运用 线段树真np 真好用,真强
题目链接
https://ac.nowcoder.com/acm/contest/3005/C
直接扫一遍维护区间 会出现 遇见 0 处理麻烦的问题
直接用线段树 这一问题将会不复存在 将普通的区间加 变成 区间 * 就可!
#include <iostream>
#include <malloc.h>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#define IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
typedef long long LL;
int dis[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
const int maxn = 200000 + 10;
const LL mod = 998244353;
const int inf = 0x3f3f3f3f;
LL a[maxn];
LL c[maxn << 2];
void creat(int node, int L, int R)
{
if (L == R)
{
c[node] = a[L];
return;
}
int mid = (L + R) >> 1;
creat(node << 1, L, mid);
creat(node << 1 | 1, mid + 1, R);
c[node] = c[node << 1 | 1] * c[node << 1] % mod;
}
LL query(int node, int L, int R, int start, int end) // L, R 为查询区间
{
if (start > R || end < L)
{
return 1;
}
if (start >= L && end <= R)
{
return c[node];
}
else
{
int mid = (start + end) >> 1;
LL lans = 1;
LL rans = 1;
if (mid >= L)
lans = query(node << 1, L, R, start, mid) % mod;
if (mid + 1 <= R)
rans = query(node << 1 | 1, L, R, mid + 1, end) % mod;
return (lans * rans) % mod;
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
IO;
int n, k;
LL ans = 0;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
creat(1, 1, n);
for (int i = 1; i + k - 1 <= n; i++)
{
int x = i;
int y = i + k - 1;
ans = max(ans, query(1, x, y, 1, n) % mod) % mod;
}
cout << ans;
return 0;
}