Description

在JIH考察的地图中有N个城市,被公路依次连成了一个环,JIH想在这些城市中建一个玩具厂。城市和公路都被编号为1..N,i号公路连接i-1号城市与i号城市(1号公路连接N号城市与1号城市),每个城市对玩具的需求为wi,每条公路的长度为di。当JIH在第i号城市建玩具厂时,JIH需要将玩具运输到其他城市(当然i城市除外)。设第i号城市到第j号城市的两条路径长度分别为l1、l2,则将玩具运输到第j号城市的费用为l1*l2*wj。总的运输费用为将玩具运到所有城市的运输费用的总和。
JIH当然想要总的运输费用最少,所以他会选最优的城市建玩具厂,如果有多个最优的城市,小月会等概率的选取其中一个建玩具厂。
由于JIH的调查工作没做好,只知道1..N-1号城市的wi,而N号城市的wi只知道它的取值范围[a,b],假设wi的值在实数区间[a,b]上的概率是均匀分布的。现在JIH只好去进行第二次调查,于是我们想知道每个城市建玩具厂的概率是多少。
 
 

Input

第一行有三个正整数N,a,b。
接下来N-1行每行一个正实数,为w[1]到w[N-1]。
接下来N行每行一个正实数,为d[1]到d[N]。
 

Output

N行,每行一个实数,表示在第i个城市建厂的概率
 

Sample Input

5 1 100
50
25
25
50
1
2
3
2
1

Sample Output

0.090
0.000
0.000
0.090
0.821

HINT

当w[5]<18.75时,将在1或4号城市建玩具厂,当w[5]>18.75时,将在5号城市建玩具厂,
当w[5]=18.75时,将在1或4或5建玩具厂。
100%的数据中:N<=100000,a<=b<=10000,w[i]<=10000,d[i]<=10。
 
 
先将每个点的代价表示为kx+b的形式,然后维护个凸包求出每段区间最低的直线,进而求出每条直线即每个点被选的概率。
现在瓶颈在求出每个点的b。
如果将厂设在i-1点 l[j],r[j]为i-1点和j点的两条路长度,则
b[i-1]=Σl[j]*r[j]*w[j]
同理b[i]=Σ(l[j]+d[i])*(r[j]-d[i])*w[j]
作差得 b[i]-b[i-1]=Σw[j]*(r[j]*d[i]-l[j]*d[i]-d[i]*d[i])
=Σw[j]*r[j]*d[i]-Σw[j]*l[j]*d[i]-Σw[j]*d[i]*d[i]
维护Σw[j]*r[j]Σw[j]*l[j]即可。
先暴力求出第1个点的b,然后O(1)转移求其他点的b,求所有点的b变成了O(N)。
注意:有重复的直线,他们要平分概率。
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 100005
#define eps 1E-9
#define inf 1E100
using namespace std;
int n,flag,cnt,siz,pos[maxn];
double w[maxn],d[maxn],dist[maxn],tot,tmp,ans,t1,t2,t3,val[maxn];
double a,b,l,r,f[maxn],p[maxn];
struct Line{
double k,b;
int id;
}line[maxn],tl[maxn];
bool cmp(Line x,Line y){
if (abs(x.k-y.k)>eps) return x.k>y.k;
return x.b<y.b;
}
double calc(Line l1,Line l2){return -(l1.b-l2.b)/(l1.k-l2.k);}
struct DATA{
double x;
int id;
}list[maxn];
void solve(){
memcpy(tl,line,sizeof(line));
sort(tl+,tl+n+,cmp);
for (int i=,j,t;i<=n;i=j){
line[++cnt]=tl[i],t=;
for (j=i;tl[j].k==tl[i].k;j++) if (tl[j].b==tl[i].b) pos[tl[j].id]=cnt,t++;
for (j=i;tl[j].k==tl[i].k;j++) if (tl[j].b==tl[i].b) p[tl[j].id]=1.0/t;
}
list[siz=]=(DATA){-inf,};
for (int i=;i<=cnt;i++){
double t=calc(line[i],line[list[siz].id]);
while (t<list[siz].x) siz--,t=calc(line[i],line[list[siz].id]);
list[++siz]=(DATA){t,i};
}
list[++siz]=(DATA){inf,cnt+};
l=a,r=b,flag=;
for (int i=;i<=siz&&flag!=;i++){
if (list[i].x>l){
if (!flag) flag=,f[list[i-].id]=(list[i].x-l)/(r-l);
else if (flag==&&list[i].x<r) f[list[i-].id]=(list[i].x-list[i-].x)/(r-l);
else if (list[i].x>=r) f[list[i-].id]=(r-list[i-].x)/(r-l),flag=;
}
}
for (int i=;i<=n;i++) p[i]=f[pos[i]]*p[i];
for (int i=;i<=n;i++) printf("%.3lf\n",p[i]);
}
int main(){
scanf("%d%lf%lf",&n,&a,&b);
for (int i=;i<n;i++) scanf("%lf",&w[i]);
for (int i=;i<=n;i++) scanf("%lf",&d[i]);
for (int i=;i<=n;i++) dist[i]=d[i];
for (int i=;i<=n;i++) dist[i]+=dist[i-];
tot=dist[n];
if (a==b){
w[n]=a;
t1=w[]*tot,t3=w[];
for (int i=;i<=n;i++){
tmp+=w[i]*(dist[i]-dist[])*(tot-dist[i]+dist[]);
t1+=w[i]*(dist[i]-dist[]);
t2+=w[i]*(tot-dist[i]+dist[]);
t3+=w[i];
}
val[]=ans=tmp;
for (int i=;i<=n;i++){
tmp+=t1*d[i]-t2*d[i]-t3*d[i]*d[i];
ans=min(ans,tmp);
val[i]=tmp;
t1+=w[i]*tot,t2-=w[i]*tot;
t1-=t3*d[i],t2+=t3*d[i];
}
cnt=;
for (int i=;i<=n;i++) if (abs(val[i]-ans)<=eps) cnt++;
for (int i=;i<=n;i++) if (abs(val[i]-ans)<=eps) printf("%.3lf\n",1.0/cnt);
else puts("0.000");
return ;
}
l=,r=tot;
for (int i=;i<=n;i++) l+=d[i],r-=d[i],line[i].k=l*r;
t1=w[]*tot,t3=w[];
for (int i=;i<=n;i++){
tmp+=w[i]*(dist[i]-dist[])*(tot-dist[i]+dist[]);
t1+=w[i]*(dist[i]-dist[]);
t2+=w[i]*(tot-dist[i]+dist[]);
t3+=w[i];
}
line[].b=tmp;
for (int i=;i<=n;i++){
tmp+=t1*d[i]-t2*d[i]-t3*d[i]*d[i];
line[i].b=tmp;
t1+=w[i]*tot,t2-=w[i]*tot;
t1-=t3*d[i],t2+=t3*d[i];
}
for (int i=;i<=n;i++) line[i].id=i;
solve();
return ;
}

bzoj4306: 玩具厂的更多相关文章

  1. C#设计模式之装饰者

    IronMan之装饰者 前言 上一篇的文章我们讲到要给"IronMan"配备"武器",并且还使用了"武器",效果还是不错的,对于多种环境.多 ...

  2. C#设计模式之工厂

    IronMan之工厂 前言 实用为主,学一些用得到的技术更能在如今的社会里保命. 虽然在日常的工作中设计模式不是经常的用到,但是呢,学习它只有好处没有坏处. 设计模式像是一种“标签”,它是代码编写者思 ...

  3. 2017.07.11【NOIP提高组】模拟赛B组

    Summary 今天的比赛打得还不错,第一题被同桌灌输的贪心,纯模拟洗脑了,然后steal的看了一下,发现怎么也对不了,一直在检查.最后10分钟才找出反例,推出动态规划方程,没有想到怎么转移,比赛就结 ...

  4. python 全栈开发,Day132(玩具管理页面,控制玩具通讯录,基于请求的好友关系建立)

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.5.zip 注意:由于涉及到 ...

  5. python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)

    一.玩具开机提示语 先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.2.zi ...

  6. 45.更新一下scrapy爬取工商信息爬虫代码

    这里是完整的工商信息采集代码,不过此程序需要配合代理ip软件使用.问题:1.网站对ip之前没做限制,但是采集了一段时间就被检测到设置了反爬,每个ip只能访问十多次左右就被限制访问.2.网站对请求头的检 ...

  7. VR与AR的发展趋势分析

    概要 你是否想象过与神秘的深海生物近距离接触?你是否梦想过穿戴钢铁侠那样的超先进科技装备成为超级英雄?你又是否幻想过与梦中的女神面对面的交流?这些可能在以前都只能是存在于脑海中的幻想,可是在如今有一项 ...

  8. 《深入浅出数据分析》-利用Excel的Solver求橡皮玩具的最大利润

    背景:一玩具厂可以生产两种浴盆玩具,分别是橡皮鸭和橡皮鱼,并且原材料和生产时间都有所限制,求如何才分配生产两种玩具的数量才可以让厂商达到最大利润. 假设条件如下: 产品名称 数量   duck a   ...

  9. bzoj AC倒序

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

随机推荐

  1. zzuoj 10408: C.最少换乘【最短路dijkstra】

    10408: C.最少换乘 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 31  Solved: 8[Submit][Status][Web Board ...

  2. Unable to locate the Javac Compiler 解决办法

    在使用eclipse对maven项目进行编译打包(Run As->Maven install)时,报以下错误:[ERROR] Failed to execute goal org.apache. ...

  3. dubbo服务+Spring事务+AOP动态数据源切换 出错

    1:问题描述,以及分析 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...

  4. bzoj2243 sdoi2011 染色 paint

    明明是裸树剖 竟然调了这么久好蛋疼 大概是自己比较水的原因吧 顺便+fastio来gangbang #include<iostream> #include<cstring> # ...

  5. erlang mnesia数据库设置主键自增

    Mnesia是erlang/otp自带的分布式数据库管理系统.mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足.mnesia数据表没有主键自增的功能,但在mnesi ...

  6. 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

    群里看到这道题,用python做了做, def find(array): v_sum = greatest = 0 for a in array: v_sum += a v_sum = 0 if v_ ...

  7. java 中的反射

    反射技术并不陌生,如何使用 ? 获取到类的全名 即可获取类中所有的信息: 构造.方法.成员变量等: 反射技术好多框架在使用,比如以前我们用jdbc,Class.forName("com.my ...

  8. Team Foundation Server 2013 with Update 3 Install LOG

    [Info   @10:14:58.155] ====================================================================[Info   @ ...

  9. 最近新出的C++右值引用的意思

    看了一下这种方法的介绍,个人感觉,右值引用,更像人类的思想了,有些将编译前与编译后结合紧密的感觉. 左值引用是变量名的别名,右值引用是值的别名,也就是不将值赋给一个变量名所在的地址,直接将值所在的初始 ...

  10. java 数据库两种连接方法

    package jdbc; import java.sql.*; public class ConnectionDemo2 { public static final String DBDRIVER= ...