码迷,mamicode.com
首页 > 其他好文 > 详细

题解 P4085 【[USACO17DEC]Haybale Feast】

时间:2020-09-17 14:16:14      阅读:26      评论:0      收藏:0      [点我收藏+]

标签:usaco   lang   uil   class   span   main   自己   def   space   

开始水了,感觉又是一道虚假的蓝题

题意

非常好理解,自己看吧

题解

可以比较轻易的发现,如果对于一段满足和大于等于 \(m\) 的区间和其满足和大于等于 \(m\) 的子区间来说,选择子区间肯定是不会更劣的,所以对于一个右边界 \(r\) ,我们只需要找出满足条件的最大的左边界 \(l\) ,就可以更新答案了。

不难发现,这个左右边界都是单调递增的,所以可以考虑尺取法,同时在维护一个区间最大值。

维护区间最大值的东西有很多:线段树,\(st\) 表,单调队列,平衡树(\(set\))……随便用一个就可以了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m;
int s[2][N];
struct Seg_Tree
{
	int n,tr[N<<4];
	void up(int u){tr[u]=max(tr[u<<1],tr[u<<1|1]);}
	void build(int u,int l,int r,int a[])
	{
		if(l==r) {tr[u]=a[l];return;}
		int mid=(l+r)>>1;
		build(u<<1,l,mid,a);
		build(u<<1|1,mid+1,r,a);
		up(u);
		return;
	}
	int query(int u,int l,int r,int x,int y)
	{
		if(x<=l&&r<=y) return tr[u];
		int mid=(l+r)>>1,res=0;
		if(x<=mid) res=max(res,query(u<<1,l,mid,x,y));
		if(y>mid) res=max(res,query(u<<1|1,mid+1,r,x,y));
		return res;
	}
}t;
int ans=1e9+7;
signed main()
{
	cin>>n>>m;t.n=n;
	for(int i=1;i<=n;++i)
	scanf("%lld%lld",&s[0][i],&s[1][i]);
	t.build(1,1,t.n,s[1]);
	int l=1,r=0,tmp=0;
	while(tmp<m)
	tmp+=s[0][++r];
	for(;r<=n;++r)
	{
		tmp+=s[0][r];
		while(tmp-s[0][l]>=m)
		tmp-=s[0][l++];
		ans=min(ans,t.query(1,1,t.n,l,r));
	}
	printf("%lld\n",ans);
	return 0;
}

题解 P4085 【[USACO17DEC]Haybale Feast】

标签:usaco   lang   uil   class   span   main   自己   def   space   

原文地址:https://www.cnblogs.com/Point-King/p/13618577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!