【JZOJ A组】逛公园

版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/83540094

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);
	}
}

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/83540094