zoukankan      html  css  js  c++  java
  • P4085 [USACO17DEC]Haybale Feast

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

    题意

    非常好理解,自己看吧

    题解

    可以比较轻易的发现,如果对于一段满足和大于等于 (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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    用 PHP 和 MySQL 保存和输出图片
    windows XP+Apache+PHP5+MySQL的安装与配置方法
    PHP语法学习笔记
    wap开发环境搭建
    三款免费的PHP加速器:APC、eAccelerator、XCache比较
    window下apache与tomcat整合
    用PHP的ob_start();控制您的浏览器cache!
    一些经典常用的正则表达式
    windows下为apache配置多个站点
    windows下IIS与Tomcat共存的问题
  • 原文地址:https://www.cnblogs.com/Point-King/p/13618577.html
Copyright © 2011-2022 走看看