【BZOJ4030】[HEOI2015]小L的白日梦

题面

BZOJ

洛谷

题解

要求的是最小的不开心连续段的期望。

然后发现自己就不会做了。

然后就可以来抄题解啦。

首先来猜性质:

  • 第一个,一定是按照不高兴的概率单调不增的一个序列。

    还是比较容易猜到的,这个证明也不难,首先我们把这个期望的式子给列出来,发现是:

\[E=\sum_{i=1}^n (1-a_{i-1})a_i
\]

也就是强制在每一段的开头位置统计,那么这个位置必定满足前一天是开心的,且这一天是不开心的。并且因为是单调的,所以满足\(a_i\ge a_{i+1}\)。

现在假设把某两个位置交换,假设这两个位置是\(i,j\),且\(i<j\),那么:

\[\begin{aligned}\Delta=&(1-a_{i-1})a_i+(1-a_i)a_{i+1}+(1-a_{j-1})a_j+(1-a_j)a_{j+1}\\
&-(1-a_{i-1})a_j-(1-a_j)a_{i+1}-(1-a_{j-1})a_i-(1-a_i)a_{j+1}\\
=&(1-a_{i-1})(a_i-a_j)+(1-a_i)(a_{i+1}-a_{j+1})\\
&+(1-a_{j-1})(a_j-a_i)+(1-a_j)(a_{j+1}-a_{i+1})\\
=&(a_i-a_j)(a_{j-1}-a_{i-1})+(a_{i+1}-a_{j+1})(a_j-a_i)\\
=&(a_i-a_j)(a_{j-1}+a_{j+1}-a_{i-1}-a_{i+1})
\end{aligned}\]

显然\(\Delta=E-E'<0\),所以有\(E<E'\),所以就证明了如果序列是单调不增的话期望是最小的。

  • 第二个结论:选择的一定是按照概率排序之后的一段前缀和一段后缀。

    我一开始猜的以为一定是前缀......

    假设我们选择的是一段前缀\([1,i]\),一段后缀\([j,n]\)。当然都是按照从大往小的顺序排序之后的结果。然后不考虑在中间选择了一段,考虑在中间选择了一个会怎么样,假设在两次选择中,在中间选择了\(x\)和\(y\),\(x<y\)。

    那么两者的期望的变化量分别是:

\[\begin{aligned}
\Delta&=(1-a_i)a_x+(1-a_x)a_j-(1-a_i)a_y+(1-a_y)a_j\\
&=(1-a_i)(a_x-a_y)+a_j(a_y-a_x)\\
&=(a_x-a_y)(1-a_i-a_j)
\end{aligned}\]

发现\((1-a_i-a_j)\)是定值,那么讨论一下,如果它大于\(0\),那么\((a_x-a_y)\)一定是越小越好,所以会尽可能靠向\(j\),反过来一定靠向\(i\)。那么既然都尽可能靠向了,那么就直接放在一起好啦。

  • 第三个性质:每个东西要么选\(1\)个,要么全部选掉。除了这两种情况之外的情况最多只可能出现一次。

    首先假装我们不知道这个东西,考虑怎么做,我们可以预处理前缀和后缀的最大贡献,然后枚举一个前缀的端点,那么对于所有后缀而言,找一个最大的贡献就行了。

    但是这样子做不了\(1e9\),因为你需要枚举端点的确切位置。

    现在我们来考虑这个性质怎么处理,首先没有选完整的最多只会有两块,即前缀的最后一段和后缀的最靠前的一段。

    那么我们这么考虑,假设后缀的最靠前的一段多出来了若干个,那么如果把一个变成前缀的最后一个的变化量是\(\Delta\),那么丢到这一段只剩一个之前,每次往前丢一个贡献都是\(\Delta\),这个很显然。所以可以把后缀的这一段变得只剩一个,然后就符合上面的情况了。

具体实现我也是抄代码了QwQ。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 100100
#define double long double
const double eps=1e-10;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Node{double p;int c;}p[MAX];
bool cmp(Node a,Node b){return a.p>b.p;}
int n,K;
int main()
{
int T=read();
while(T--)
{
n=read();K=read();
for(int i=1;i<=n;++i)
{
int x=read(),y=read();
p[i].p=1.0*x/y,p[i].c=read();
}
sort(&p[1],&p[n+1],cmp);
int l=1,r=n,t;
while(!p[l].c)++l;while(!p[r].c)--r;
p[l].c-=1;p[r].c-=1;K-=2;
double pl=p[l].p,pr=p[r].p;
double ans=0;
while(K)
{
while(!p[l].c)++l;
while(!p[r].c)--r;
if(1-pl>pr)
{
if(fabs(pr-p[r].p)>eps)t=1;
else t=min(K,p[r].c);
ans+=(1-p[r].p)*pr+(t-1)*(1-p[r].p)*p[r].p;
K-=t;p[r].c-=t;pr=p[r].p;
}
else
{
if(fabs(pl-p[l].p)>eps)t=1;
else t=min(K,p[l].c);
ans+=(1-pl)*p[l].p+(t-1)*(1-p[l].p)*p[l].p;
K-=t;p[l].c-=t;pl=p[l].p;
}
}
ans+=(1-pl)*pr;
printf("%.6Lf\n",ans);
}
return 0;
}

【BZOJ4030】[HEOI2015]小L的白日梦的更多相关文章

  1. BZOJ 4030: [HEOI2015]小L的白日梦

    4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 172  Solved: 39[Submit][Statu ...

  2. HEOI2015小L的白日梦

    题面链接 洛咕 sol 为什么网上面只有神仙题解啊!!! 引起我这种蒟蒻不适QAQ. 性质证明留给巨佬 然后我只贴性质了QwQ. 1.一定存在最优解每一天不高兴的概率是单调不增的. 2.一定存在最优解 ...

  3. P4110 [HEOI2015]小L的白日梦

    传送门 题解 //minamoto #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef l ...

  4. bzoj4030【HEOI2015】小L的白日梦

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4030 sol  :orz Yousiki http://www.cnblogs.com/you ...

  5. 洛谷U4727小L的二叉树[树转序列 LIS]

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  6. ACM D的小L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  7. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  8. nyoj-366-D的小L(求全排列)

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2 描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡 ...

  9. 洛谷U4727 小L 的二叉树

    U4727 小L 的二叉树 题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树 ...

随机推荐

  1. Autofac 和 Quartz.Net 自动注入的整合

    一:问题场景 在一次项目开发中,项目中已使用了Autofac.在新需求中要用到Quatrz.Net.在任务中使用注入方法,确始终无法使用注入的方法,经过千百次的度娘,终于找到了解决办法!吐槽下度娘真心 ...

  2. html meta标签使用及属性介绍

    自学前端开始,我对meta标签接触不多,主要把精力都集中在能显示出来的标签上,比如span.button.h1等等.有时候去查看一些知名网站的源码,发现head标签里有一大摞的meta. 今天就来学习 ...

  3. WEB前端学习资源清单

    常用学习资源 JS参考与基础学习系列 [MDN]JS标准参考 es6教程 JS标准参考教程 编程类中文书籍索引 深入理解JS系列 前端开发仓库 <JavaScript 闯关记> JavaS ...

  4. App隐私条款

    欢迎光临本app,请您仔细阅读以下条款,如果您对本协议的任何条款表示异议,您可以选择不使用本app:进入本app则意味着您将同意遵守本协议下全部规定,并完全服从于app开发者的统一管理. 第一章 总则 ...

  5. 【广州.NET社区线下活动】云定未来 - Azure Meetup

    第2届 广州.NET线下沙龙 Azure Meetup 4月13日,第2届广州.NET线下沙龙在广州银行大厦7楼中创学院路演大厅成功举办.来自微软MVP.网易的技术专家们带来了干货满满的知识分享,即使 ...

  6. 如何在Android studio上运行从github上下载的RN项目

    想要编译别人的RN项目,还是要踩踩坑才能走上正轨啊,分享下我试过多种方法后最喜欢的方法(其实是因为我多次用VS Code编译都是以失败而告终,所以才选择的studio) 注意:这一步是你的开发环境都安 ...

  7. Java版 人脸识别SDK demo

    虹软人脸识别SDK之Java版,支持SDK 1.1+,以及当前最新版本2.0,滴滴,抓紧上车! 前言 由于业务需求,最近跟人脸识别杠上了,本以为虹软提供的SDK是那种面向开发语言的,结果是一堆dll· ...

  8. Python 小试牛刀,Django详细解读,让你更快的掌握它!!!

    一.MVC和MTV模式 MVC:将web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...

  9. 所有eclipse版本,主题黑化,代码黑化的简单两步

    一.下载两个文件 二.打开eclipse,Import   .epf文件 三.把.jar 复制到 eclipse的plugins目录下,重启eclipse 效果如下: 注 以上方法:来自互联网

  10. golang 日期时间处理

    package main import ( "fmt" "time" ) func main() { fmt.Println(time.Now()) //显示时 ...