时间:2s 空间:256M
题目描述:
小信毕业后在电子厂打工。现在在他前面一次摆放了n个产品,每个产品都有一个综合跑分值,表示为数组a。如果对于区间(l,r),里面的产品的综合跑分值最大值为x,最小值为y,则称这个区间为合格的。请你帮帮小信计算共有多少个合格的区间。
输入格式:
第一行包含三个整数 n,x,y,表示产品的个数和综合跑分值的上下限。
第二行包含n个整数a1,a2,...,an,表示每个产品的总和跑分值 。
输出格式:
输出一个整数表示答案。
样例1输入:
4 3 1
1 2 3 1
样例1输出:
4
样例2输入:
5 2 1
1 3 2 4 1
样例2输出:
0
约定:
对于100%的数据,1≤n≤2×105,1≤ai≤2×105,1≤y≤x≤2×105。
题意:
有n个产品,有综合跑分值数组a。区间(l,r)中的产品跑分值平均值在y~x之间,则这个区间为合格的,求共有多少个合格的区间。
分析:
这是一道双指针,一般来说对于符合一定条件的不固定区间一般来说都是双指针,先扩展右指针,然后将不符合条件的左指针缩进。
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[1010][2510];
int n,m,w,ans,mod=998244353;
int dp(int x,int now)
{
if(now>w)return 0;
if(x>n)
{
if(now<=w)return 1;
}
if(f[x][now]!=-1)return f[x][now];
int res=0;
for(int i=1;i<=min(m,w-now);i++)
{
res+=dp(x+1,now+i);
res%=mod;
}
return f[x][now]=res%mod;
}
signed main()
{
memset(f,-1,sizeof(f));
cin>>n>>m>>w;
cout<<dp(1,0);
}