[USACO16JAN]愤怒的奶牛Angry Cows (单调队列优化dp)
题目链接
Solution
应该可以用二分拿部分分,时间 \(O(n^2logn)\) 。
然后可以考虑 \(n^2\) \(dp\) ,令 \(f_i\) 代表 \(i\) 点被激活,然后激活 \(i\) 之前所有点所需的半径。
那么很显然 \(f[i]=min(max(pos[i]-pos[j],f[j]))\) 其中 \(j<i\) 。
再从后往前记录一个 \(g[i]\) , 那么答案就为 \(min(max(f[i],g[i]))\)以及还要考虑两点中间的,其中 \(1<=i<=n\) 。
但是如果 \(n^2\) 处理解决不了 \(50000\) 的数据。
考虑优化。
观察到 \(f[j]\) 是递增的,而 \(pos[i]-pos[j]\) 是递减的。
那么只要是后面的 \(f[i]\) 比前面小的话,那么肯定他是最优解。
所以维护一个 \(f[i]\) 递增的单调队列即可。
Code
#include<bits/stdc++.h>
#define ll long long
#define N 50005
using namespace std;
ll n,a[N];
double pos[N],f[N],g[N];
void in(ll &x)
{
ll f=1,w=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
x=f*w; return;
}
int main()
{
in(n);
for(int i=1;i<=n;i++)
{
ll x; in(x);
pos[i]=x*1.0;
}
sort(pos+1,pos+n+1);
if(n==1){cout<<0<<endl;return 0;}
if(n==2){cout<<pos[2]-pos[1]<<endl;return 0;}
f[2]=pos[2]-pos[1];
int head=1,tail=0;
a[++tail]=2;
for(int i=3;i<=n;i++)
{
while(max(pos[i]-pos[a[head]],f[a[head]]+1.0)>max(pos[i]-pos[a[head+1]],f[a[head+1]]+1.0))
{if(head==tail)break;head++;}
f[i]=max(pos[i]-pos[a[head]],f[a[head]]+1.0);
while(f[i]<f[a[tail]]){tail--;if(tail<head)break;}
a[++tail]=i;
}
g[n-1]=pos[n]-pos[n-1];
memset(a,0,sizeof(a));
head=tail=1;
a[tail]=n-1;
double ans=(0x3f3f3f3f3f)*1.0;
for(int i=n-2;i>=1;i--)
{
while(max(pos[a[head]]-pos[i],g[a[head]]+1)>max(pos[a[head+1]]-pos[i],g[a[head+1]]+1))
{if(head==tail)break;head++;}
g[i]=max(pos[a[head]]-pos[i],g[a[head]]+1);
while(g[i]<g[a[tail]]){tail--;if(tail<head)break;}
a[++tail]=i;
}
for(int i=1;i<=n;i++)
{
ans=min(max(f[i]*1.0,g[i]*1.0),ans);
if(i>1)
ans=min(max((pos[i]-pos[i-1])*1.0/2,max(f[i-1]*1.0+1,g[i]*1.0+1)),ans);
}
printf("%.1lf",ans);
return 0;
}
[USACO16JAN]愤怒的奶牛Angry Cows (单调队列优化dp)的更多相关文章
- [USACO16JAN]愤怒的奶牛Angry Cows
传送门 一道神奇的DP………(鬼知道他为什么在tarjan里面) 一开始可能会考虑贪心或者什么其他神奇的算法,不过还是DP比较靠谱. 我们用f[i]表示摧毁所有i左侧的炸 药包最少需要的能量,用g[i ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP
BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...
- 【单调队列优化dp】 分组
[单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...
- [小明打联盟][斜率/单调队列 优化dp][背包]
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
随机推荐
- adbl连接不上 daemon not running. starting it now on port 5037 ADB server didn't ACK
http://blog.csdn.net/prettyice2005/article/details/38682443 adbl连接不上 daemon not running. starting i ...
- VMWARE 克隆步骤
克隆linux服务器点击设置 ->网络适配器->高级->MAC地址 重新生成一个 OK
- java二周的学习总结
一转眼二周就过去了,个人觉得虽然java和C语言有差异,但差别并不大,因为语法语句方面都是差不多的,因为我上个学期并没有很认真的学好C语言,所以我这个学期更希望学好java,java方面还是挺有趣的, ...
- 一次特殊的“VARCHAR转numeric失败”错误记录
今天接触到一个很有意思的问题.当我在执行一条INSERT的sql语句时,他总是报字符串转数字类型失败. 问题 首先,该表中的所有数字类型的字段都是非必填,其次,每个数字类型的字段都有默认值.最令我感到 ...
- [Git] 001 初识 Git 与 GitHub 之新建仓库
在 GitHub 的 UI 界面使用 Git 新建一个仓库 1. 点击右上角的 +,选择 New repository 2. 网站会自动跳转至新页面,在下框中填入仓库名 仓库名也有讲究,挖个坑,日后填 ...
- spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用
1.去官方网站下载aspectj-1.8.0.jar 2.在jar包目录启动cmd,执行java -jar aspectj-1.8.0.jar,Next 3.检查JAVA_HOME路径是否正确,如果不 ...
- 十二、支持向量机(Support Vector Machines)
12.1 优化目标 参考视频: 12 - 1 - Optimization Objective (15 min).mkv 到目前为止,你已经见过一系列不同的学习算法.在监督学习中,许多学习算法的性能都 ...
- MVC的view页面内嵌C#语法发现路径被转码的解决方法
一,上视图代码,如下 console.log('@urlquery.ToString()'); console.log('@Html.Raw(urlquery.ToString())'); 二,显示结 ...
- python数据结构:numpy
一. numpy概述 numpy(Numerical Python)提供了python对多维数组对象ndarray(应该是N-dimension array)的支持,具有矢量运算能力,快速.节省空间. ...
- HTML文件头部元素作用
1.DOCTYPE的作用 DOCTYPE是document type(文档类型)的缩写.<!DOCTYPE html>声明位于文档最前面,主要作用是告诉浏览器的解析器使用哪种HTML规范或 ...