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;
}
浙公网安备 33010602011771号