题目链接

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)的更多相关文章

  1. [USACO16JAN]愤怒的奶牛Angry Cows

    传送门 一道神奇的DP………(鬼知道他为什么在tarjan里面) 一开始可能会考虑贪心或者什么其他神奇的算法,不过还是DP比较靠谱. 我们用f[i]表示摧毁所有i左侧的炸 药包最少需要的能量,用g[i ...

  2. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  3. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  4. 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 ...

  5. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  6. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  7. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  8. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  9. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

随机推荐

  1. Jmeter之Switch Controller

    在测试过程中,各种不同的情况需要执行不同的操作,这个时候用if控制器比较麻烦,此时就可以使用Switch Controller代替. 一.界面显示 二.配置说明 1.名称:标识 2.注释:备注 3.S ...

  2. 16/7/7_PHP-面向对象关键词

    转载地址: http://blog.sina.com.cn/s/blog_5182b171010092fb.html PHP5 是一具备了大部分面向对象语言的特性的语言,比PHP4 有了很多的面向对象 ...

  3. IDEA怎样在3.0中修改彩色字体。

    首先 找到 第一个File之后再找到Setting点击打开之后有Editor里面有colors和Fonts在下面是language  defaults        Semantic highligh ...

  4. 安全运维 - Linux系统攻击回溯

    入侵排查思路 (1)- 日志分析 日志分析 默认日志路径: /var/log 查看日志配置情况: more /etc/rsyslog.conf 重要日志: 登录失败记录: /var/log/btmp ...

  5. python+selenium的frame表单切换

    switch_to.frame()                               切换frame switch_to.default_content()                切 ...

  6. 使用gitlab的webhook进行前端自动部署

    gitlab有个功能叫webhook,比较适合前端代码的自动部署.其中的逻辑在  http://172.30.83.152:30080/help/user/project/integrations/w ...

  7. IO流 -字符输入输出流,以及异常处理方法

    字符输入流 java.io.Reader: 字符输入流的顶层抽象父类 共性的成员方法: int read() 读取单个字符,并返回. int read(char[] cbuf) 将字符读入数组. ab ...

  8. vps配置ipv6地址

    1.修改配置文件 vim /etc/network/interfaces 2.添加以下内容 auto he-ipv6 iface he-ipv6 inet6 v4tunnel address 2001 ...

  9. 关于html5 video的连续播放

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. OpenCV-----Numpy数组

    Nunmpy数组包含: 强大的N维数组对象 复杂的(广播)功能 集成C / C ++和Fortran代码的工具 有用的线性代数,傅立叶变换和随机数功能 遍历与修改数组中的所有像素点 #对所有像素进行循 ...