前言
上一篇RMQ博客:http://blog.csdn.net/mr_wuyongcong/article/details/79253383
正题
题目
要给奶牛放假,每天有一定的快乐值(有可能是负数),假期不能小于p天或大于q天,求最大快乐值
输入
第一行:N,P,Q.
第二行:N个数字,中间用一个空格隔开。
输出
一个整数,奶牛们能获得的最大享受指数。
样例输入
5 2 4
-9 -4 -3 8 -6
样例输出
5
解题思路
从i天放假q天的最大值其实就包括了从p到q-1的最大值,所以我们只需要求地q-1的就好了,这里用RMQ加前缀和求。
代码
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int n,p,q;
long long k,s;
long long f[100001][21],maxs;//一定要long long
long long re(long long x,long long y)
{long long z=(long long)(log(y-x+1)/log(2));return max(f[x][z],f[y+1-(1<<z)][z]);
}//求x到y的最大值
int main()
{scanf("%d%d%d",&n,&p,&q);for (int i=1;i<=n;i++){scanf("%lld",&k);//输入s+=k;//前缀和f[i][0]=s;//初始化}for (int j=1;(1<<j)<=n;j++)for (int i=1;i+(1<<j)-1<=n;i++){f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);}//RMQ不解释,详见我上篇博客(前言有地址)maxs=-1*1e11;//小for (int i=1;i<=n-p+1;i++){maxs=max(maxs,re(i+p-1,min(n,q+i-1))-f[i-1][0]);//求最大值}printf("%lld",maxs);
}