题意

在一条数轴上从左向右有一些气球,每个气球一开始位于横坐标xi的位置,是半径为0的圆.现在开始从左向右给每个气球充气.被充气的气球的半径会不断变大,直到达到这个气球的半径上限Ri或者这个气球和之前被充气的某个气球相切.在半径变大的过程中,气球始终和数轴在横坐标xi的位置相切(即气球的位置不变).

问最后每个气球的半径.

40% n<=2000

100% n<=200000

分析

非常妙的题然而还是不会做

首先考虑暴力怎么做:模拟气球充气的过程,从左到右考虑每个气球的最大半径.

对于第i个气球,它前面的i-1个气球都会对它的半径有一个限制,第j个气球(\(j<i\))使得第i个气球的半径不能超过\(f(i,j)\).假设第j个气球位于\(xj\),第i个气球位于\(xi\),第j个气球充气后半径为R,那么\(f(i,j)=(xi-xj)^2/(4R)\)

我们对所有的f(i,j)和ri取最小值就可以得到i充气之后的半径.这样是\(O(n^2)\)的.

接下来可以观察出一个性质:对于i左侧的两个已经充气的气球j1,j2,如果j1在j2左侧且j1的半径小于j2,那么第i个气球在碰到j1之前必须先碰到j2,也就是会因为j2的阻挡碰不到j1,画画图是比较明显的.严谨一点,这时候一定有\(f(i,j1)>f(i,j2)\).

那么我们既然是从左向右考虑所有气球,就可以对前面的所有气球维护一个单调栈,只存储那些"右侧不存在半径更大的气球"的气球,每次只考虑栈里的气球对第i个气球的影响,然后把第i个气球扔到栈里,该弹出栈的弹出来.然而这样好像复杂度还是\(O(n^2)\)

我做到这里之后就想偏了...考虑有没有单峰性质或者决策单调性,发现都没有,就看题解去了你们看这就是辣鸡

题解非常妙地做到了O(n).

具体是这样:

我们从栈顶的气球开始考虑其对第i个气球的影响.第i个气球的半径初始化为上限ri,然后对f(i,栈顶的气球)取min.

假如取min之后第i个气球的半径比栈顶大:

那么根据刚才观察的性质,这个栈顶之后就没有用了,把它弹出来.如果此时栈非空,那么继续考虑新的栈顶对第i个气球的影响.如此循环,直到栈为空或者第i个气球取min之后的半径比栈顶的半径小.

假如取min之后第i个气球的半径比栈顶小:

考虑栈里其他的气球(在栈顶气球的左侧).既然栈顶的气球在第i个气球的左侧且现在半径比第i个气球大,那么栈顶气球左侧的气球想要碰到第i个气球就必须先碰到栈顶的气球,也就是会因为栈顶的气球的阻挡而不能碰到第i个气球(和刚才观察的性质是对称的)

因此,此时栈里的其他气球不会再对第i个气球的半径产生影响,我们此时得到了第i个气球的最终答案.把第i个气球扔到栈里就可以继续考虑第i+1个气球了.

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=200005;
double x[maxn],r[maxn];
double R[maxn];
int stk[maxn],top=0;
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%lf%lf",x+i,r+i);
for(int i=1;i<=n;++i){
R[i]=r[i];int g=i;
while(top){
double tmp=(x[i]-x[stk[top-1]])*(x[i]-x[stk[top-1]])/4.0/R[stk[top-1]];
R[i]=min(R[i],tmp);
if(R[i]<R[stk[top-1]])break;
else --top;
}
stk[top++]=i;
}
for(int i=1;i<=n;++i)printf("%.3f\n",R[i]);
return 0;
}

bzoj2383[CEOI2011] ballons的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 湖南大学ACM程序设计新生杯大赛(同步赛)H - Yuanyuan Long and His Ballons

    题目描述 Yuanyuan Long is a dragon like this picture?                                     I don’t know, ...

  3. 【BZOJ2384】[Ceoi2011]Match KMP

    [BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...

  4. bzoj 2387: [Ceoi2011]Traffic

    bzoj 2387: [Ceoi2011]Traffic 题目描述 The center of Gdynia is located on an island in the middle of the ...

  5. 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)

    [LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...

  6. [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组

    2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...

  7. [bzoj1135][Ceoi2011]Match_线段树

    [Ceoi2011]Match 题目大意:初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负, ...

  8. [Ceoi2011]Traffic

    #2387. [Ceoi2011]Traffic Online Judge:Bzoj-2387,Luogu-4700 Label:Yy,Tarjan缩点,dfs 题目描述 格丁尼亚的中心位于Kacza ...

  9. HDU 1004 ballons(map)

    题意:输出颜色最多的那个颜色. 思路:水题一道. #include <iostream> #include <string> #include <map> #inc ...

随机推荐

  1. php 换行 PHP_EOL

    在unix世界换行就用/n来代替,但是windows为了体现他的不同,就用/r/n,更有意思的是在mac中用/r.因此unix系列用 /n,windows系列用 /r/n,mac用 /r,这样就用你写 ...

  2. [BZOJ1492][NOI2007]cash-[cdq分治]

    Description 传送门 Solution 首先,最优情况一定是某一天把所有金券卖出或买入是最优的. 在金券一定的情况下,分散卖一定没有统一在最优的那天卖更优. 然后,我们假定在某一天卖,则在该 ...

  3. Tomcat安装部署和安全加固优化以及反向代理应用

    1.Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同 ...

  4. Azkaban系统的安装和分析。

    Azkaban系统是一个数据处理的很好用的工具,可以用来运行hadoop任务,管理hdfs,可以进行schedule任务调度,总体来说功能还是很强大的. 研究了一下azkaban,做了以下总结性的东西 ...

  5. 9.15 DP合集水表

    9.15 DP合集水表 显然难了一些啊. 凸多边形的三角剖分 瞄了一眼题解. 和蛤蛤的烦恼一样,裸的区间dp. 设f[i][j]表示i~j的点三角剖分最小代价. 显然\(f[i][i+1]=0,f[i ...

  6. L013-linux基础正则表达式手把手实战讲解小节

    L013-linux基础正则表达式手把手实战讲解小节 这么一看又有10天没更新博客了,最近也一直在学就是时间比较闲散,再加上做上次老师留的十多道题,所以时间比较紧张,本来做完题准备直接先看L014讲解 ...

  7. Linux学习(一)------CentOs安装mysql5.5 数据库

    具体方法和步骤如下所示: 1.第一步就是看linu是否安装了mysql,经过rpm -qa|grep mysql查看到centos下安装了mysql5.1,那就开始卸载咯 2.接下来就是卸载mysql ...

  8. javaweb(三十八)——事务

    一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set mone ...

  9. JAVA学习笔记--匿名内部类

    匿名内部类,即没有名字的内部类. 我们在编写JAVA程序时,往往要创建很多类,类是可以被重复使用的.但有时,我们创建了一个类,却只需要使用该类一次,那么单独为其编写一个类就显得有些麻烦,这时可以使用匿 ...

  10. MySQL Proxy和 Amoeba 工作机制浅析

    MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...