H. Beacon Towers

题目链接:
https://codeforces.com/gym/103855/problem/H
前缀最大值:前缀最大值是指在一个数列中,对于每个位置i,计算从第一个元素到第i个元素之间的最大值。(通俗一点就是前面几个数里面最大的一个数)

由题意可知,只有这个数是前缀最大值的时候才能作为这一部分的灯塔(第一个数天然可以单独做为灯塔),中间K个数的话,共有K+1种方法切割(多出来的一种是不切割,和前面合成一个),遂推出i-pos+1
然后进行乘法定理,每个段的方案数相乘即为正解

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,mod=1e9+7;
int a[N];
int main()
{
    int n=0,maxx=0,pos=0;
    long long num=1;
    cin>>n;
    cin>>a[0];
    maxx=a[0];
    for(int i=1;i<n;i++)
    {
        cin>>a[i];
        if(a[i]>maxx)
        {
            num=num*(i-pos+1)%mod;//+1是因为可以选择不分割,k+1种分割方案
            maxx=a[i];
            pos=i;
        }
    }
    cout<<num;
    
}
posted on 2025-10-13 21:56  九十镹  阅读(11)  评论(0)    收藏  举报