本文主要是介绍【JZOJ A组】逛公园,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
策策由于在noip2017考试当天去逛公园了,没能出现在考场上,转眼到了noip2018,策策的公园也悄然转变,策策能否克服诱惑,成功坐在考场上呢?
问题描述
策策同学特别喜欢逛公园,公园可以看做有n个景点的序列,每个景点会给策策带来di 的愉悦度,策策初始有x0 的愉悦度,然而愉悦度也是有上限的,他在每个景点的愉悦度上限为li ,策策想要从 l 到 r这一段景点中选择一段景点参观(从这一段的左端点逛到这一段的右端点),策策想知道他最终的愉悦度的最大值是多少,你能帮帮他吗?(区间可以为空,也就是说答案最小为x0 )
Input
第一行两个数n,q 表示景点序列长度 和 询问个数
第二行n个数 表示di
第三行n个数 表示li
接下来q行,每行3个数:
表示 l ,r ,x0
下标均从1开始
Output
共q行,每行1个数表示愉悦度的最大值
Sample Input
6 3
0 5 3 2 0 4
8 10 8 1 9 9
1 3 9
2 6 3
3 4 0
Sample Output
10
8
3
样例说明
询问1 初始愉悦度9 只逛第2个公园 9+5=14 大于l2 ans=10
询问2 初始愉悦度3 从2逛到3 3+5+3=11 大于l3 ans=8
询问3 初始愉悦度0 只逛第3个公园 ans=3
Data Constraint
思路
这题满分有点难,我选择85暴力
这东西很像子段最大和,加一个优化就可以拿到85的好成绩
代码
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,q;
struct A
{int x,y;
}a[40077];
int main()
{freopen("park.in","r",stdin); freopen("park.out","w",stdout);scanf("%d%d",&n,&q);for(int i=1; i<=n; i++) scanf("%d",&a[i].x);for(int i=1; i<=n; i++) scanf("%d",&a[i].y);while(q--){int l,r;long long s=0,ans=0,x;scanf("%d%d%lld",&l,&r,&x); ans=s=x;for(int i=l; i<=r; i++){s=max(x,min(s+1ll*a[i].x,1ll*a[i].y)); ans=max(ans,s);}printf("%lld\n",ans);}
}
这篇关于【JZOJ A组】逛公园的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!