子段乘积(线段树区间最大值经典问题)

子段乘积(线段树区间最大值经典问题)_第1张图片

题意:查询长度为K的区间最大乘积。

思路:线段树找区间最大值。



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
#include
#include
#include
#define MAXX 100005
#define SIS std::ios::sync_with_stdio(false)
#define ll long long
#define INF 0x3f3f3f3f
//#include
using namespace std;
const int MAX =2e5+5;
const int mod=998244353;

struct node
{
    ll l,r,val;
}tre[MAX*4];
ll a[MAX];
void build(ll id,ll l,ll r)
{
    tre[id].l=l,tre[id].r=r;
    if(l==r)
    {
        tre[id].val=a[l];return ;
    }
    ll mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    tre[id].val=(tre[id*2].val*tre[id*2+1].val)%mod;

}
ll querry(ll id,ll l,ll r)
{
    if(tre[id].l>=l&&tre[id].r<=r)
    {
        return tre[id].val;
    }
    ll mid=tre[id].l+tre[id].r>>1;
    if(mid>=r)
    {
        return querry(id*2,l,r);
    }
    else if(mid<l)
    {
        return querry(id*2+1,l,r);
    }
    else
    {
        return (querry(id*2,l,mid)*querry(id*2+1,mid+1,r))%mod;
    }
}

int main(){
 SIS;
  ll n,k;
  cin>>n>>k;
  for(ll i=1;i<=n;i++)
  {
      cin>>a[i];
  }
  build(1,1,n);
  ll ans=0;
  for(ll i=1;i+k-1<=n;i++)
  {
      ans=max(ans,querry(1,i,i+k-1));
  }
  cout<<ans<<endl;
    return 0;
}


你可能感兴趣的:(牛客,线段树)