策策由于在noip2017考试当天去逛公园了,没能出现在考场上,转眼到了noip2018,策策的公园也悄然转变,策策能否克服诱惑,成功坐在考场上呢?
问题描述
策策同学特别喜欢逛公园,公园可以看做有n个景点的序列,每个景点会给策策带来di 的愉悦度,策策初始有x0 的愉悦度,然而愉悦度也是有上限的,他在每个景点的愉悦度上限为li ,策策想要从 l 到 r这一段景点中选择一段景点参观(从这一段的左端点逛到这一段的右端点),策策想知道他最终的愉悦度的最大值是多少,你能帮帮他吗?(区间可以为空,也就是说答案最小为x0 )
第一行两个数n,q 表示景点序列长度 和 询问个数
第二行n个数 表示di
第三行n个数 表示li
接下来q行,每行3个数:
表示 l ,r ,x0
下标均从1开始
共q行,每行1个数表示愉悦度的最大值
6 3
0 5 3 2 0 4
8 10 8 1 9 9
1 3 9
2 6 3
3 4 0
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
这题满分有点难,我选择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("%lldn",ans);}
}
本文发布于:2024-02-04 15:43:04,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170710818556792.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |