4030: [HEOI2015]小L的白日梦

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 172  Solved: 39
[Submit][Status][Discuss]

Description

在某一天,你有了一个女性朋友。

你打算利用k天时间陪她,每天有很多种娱乐方式可供选择,你需要从中选择一种进行(一天只能进行一个项目),比如说一起去看电影、一起去主题公园,一起去逛街等等,一共n种项目。当然每个项目重复太多次你都会觉得无聊,因此第i个项目最多进行c[i]次。你虽然智商很高,但是情商堪忧,即使这些你准备的活动都是希望让她开心的,不过由于你笨拙的语言表达和过于理智的行动,可能使这些活动出现意外。经过你悉心的计算,你发现如果某一天进行了第i个项目,如果一切顺利的话她应该是很高兴的,但她会有a[i]的概率不高兴。如果她本来是很高兴的,但突然今天你让她不高兴了,她就会觉得很失落,并且对你的好感度大大下降。你希望尽可能避免这种情况发生,因此你要安排这k天之内每天进行的项目,最小化她感到失落的期望次数。
你的女性朋友十分在意你,所以她的心情只会因为你发生改变。第一天之前,因为你没有邀请她进行任何活动,所以她是不高兴的。

Input

第一行有一个非负整数t,表示一共有t组数据。

对于每组数据,第一行有两个非负整数n,k,分别表示你准备的项目个数和你用来陪她的天数。(n<=10^5, k<=10^9)
接下来n行,每一行描述一个项目,形如“x[i]/y[i] c[i]”且三个数均为非负整数,表示进行完这个项目之后她有x[i]/y[i]的概率不高兴,并且这个项目只能进行不超过c[i]次。(x[i],y[i] <= 104,c[i] <= 10^9)

Output

一共t行,对于每组数据输出使她感到失落的最小期望次数,四舍五入保留6位小数。

Sample Input

3
1 2
0/1 3
1 2
1/1 3
1 2
1/2 3

Sample Output

0.000000
0.000000
0.250000

【样例说明】
考虑第三组数据,因为只有一个项目所以只好每天都安排这个。
在第一天之前她总是不高兴的,一共有:
第一天不高兴,第二天也不高兴、
第一天高兴,第二天不高兴、
第一天不高兴,第二天高兴、
第一天不高兴,第二天也不高兴,
这四种情况,又因为每天的项目让她高兴或者是不高兴的概率都是0.5,因此这四种情况是等概率发生的。
只有在第二种情况下,她会感到失落一次。
因此答案是(1*1+0*3)/4=0.25.

HINT

对于100%的数据,n<=105,k<=109,数据组数不会太多,大概不超过10组,数据保证分数有意义并且∑c[i]>=k。

Source

[Submit][Status][Discuss]

这种网上没有题解的题,必须要写一发骗骗访问量哈~~~

我上午做这道题的时候,网上没有专门的题解,只有jiry前辈的一篇HEOI2015系列题解可做参考,所以我就无耻地抄代码啦~~~

先转一下jiry的题解内容——

【D2T1】小L的白日梦

这题我在网上找不到题解..但是为了访问量我也是只好硬上了...我的算法建立在以下假设之上:

1.一定存在最优解每一天不高兴的概率是单调不增的。

2.一定存在最优解它选取的项目是所有项目按照不高兴的概率排序后的前缀一段加上后缀一段。

3.每一次选取的项目种类只有三种可能的情况:选了1个,全部选完,其他。且处于第三种状态的至多一个。

不要问我是怎么知道这三个假设的..我连最基本的假设1都不会证明..这些全部都是在各种暴力求证之后得到了..这A的实在是6的不行..

知道了这些假设就很简单了..假设第三种状态的是取在后缀中的,那么枚举选取前缀最右端的位置,后缀最左端的位置单调不增,扫一下就好了,反过来也是一样。

我看了看这三个假设,如果是正确的话那么jiry的做法确实很棒棒,但是我只能证明第一个,好菜啊。下午Monster__Yi来嘲讽我了,“这么水的题,你都不会证明?还考什么NOI,HEOI你就可以滚粗了!” 唔唔唔,宝宝心里苦啊……

然后在小天天(Monster_Yi)的帮助下,我(ta)证明了另外两个性质,所以记录一下,趁着他还没写赶紧骗访问量,23333

性质1:一定存在最优解每一天不高兴的概率是单调不增的

这个性质最显然,证明方法就是列个式子,用$a_i$表示排序后第i个项目的不高兴概率,那么当前的期望值就是

$$P=(1-a_0)a_1+(1-a_1)a_2+(1-a_2)a_3+...+(1-a_{n-1})a_n$$

然后考虑交换两个项,$a_i$和$a_j$,现在的期望值变成了

$$P'=(1-a_0)a_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}$$

根据$a_{i-1} \gt a_i \gt a_{i+1} \gt a_{j-1} \gt a_j \gt a_{j+1}$,

我们有

$$P-P'=(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)-a_{i+1}(a_i-a_j)-(1-a_{j-1})(a_i-a_j)+a_{j+1}(a_i-a_j)=(a_i-a_j)(-a_{i+1}-a_{i+1}+a_{j-1}+a_{j+1}) \lt 0$$

所以$P \lt P'$,即按照不高兴概率递减的顺序排列,期望更优。

性质2:一定存在最优解它选取的项目是所有项目按照不高兴的概率排序后的前缀一段加上后缀一段

这个性质也是列式子证明的。我们不妨设$A \lt B \lt C \lt D$,代表四个项目(按照不高兴概率递减的顺序排列),我们用$a,b,c,d$表示其不高兴概率,有$a\gt b\gt c\gt d$。

我们设原情况是我们从整个序列中选取了三段——[1,A],B,[D,N]。

我们设新情况是我们从整个序列中选取了三段——[1,A],C,[D,N]。

原情况的期望是$(1-a)b+(1-b)d$。

新情况的期望是$(1-a)c+(1-c)d$。

当新情况优于原情况,必然有$(1-a)b+(1-b)d>(1-a)c+(1-c)d$

解得$a+d>1$,这个就说,当$a+d>1$时,中间的点会往右靠,直到靠到后缀上;反之,中间的点会往前靠,直到靠到前缀上。所以,前缀和后缀中间不会有点被选中。

性质3:每一次选取的项目种类只有三种可能的情况:选了1个,全部选完,其他,且处于第三种状态的至多一个

前两个性质我们都是把所有项目拆成$c_i$个单独的项目考虑的,并且已经可以解决$\sum c_i \leq 10^6$时的问题了。现在我们考虑把相同项目看成一个连续的块,会有什么新的性质。

可喜可贺的是,这个性质不用列式子了,随便一想就能发现。

如果我们当前前缀的最后一个块(也就是最后一种项目)只选取了一个点,后缀的最前一个块选取了若干个点。

然后我们发现把后缀的一个名额送给前缀的最后一个块,会使期望值减少$delta$,使期望值变优。那么,我们可以说,在后缀的最后一个块露出尾巴(也就是被削减得只剩一个点)之前,我们每把一个后缀名额送给前缀,都会使得期望减少$delta$。所以我们定然会把后缀不断减少,直到其最前一个块只剩一个点为止,此时再削减最后一个块,产生的代价将不再是$delta$,所以不能继续无脑转移名额了。

可见,前缀和后缀的最后(前)一个块在某些情况只会选一个点,但绝不会同时选若干个点,都不是1而且都没有全选。

代码还是抄的jiry前辈的,毕竟我的代码功底可是非常差的。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long lng;
 4 typedef long double ldb;
 5 struct data {
 6     int cnt; ldb val;
 7     inline data(void) {};
 8     inline data(int a, ldb b)
 9         : cnt(a), val(b) {};
10     inline void read(void) {
11         static int a, b;
12         scanf("%d/%d", &a, &b);
13         val = (ldb)a / b;
14         scanf("%d", &cnt);
15     }
16 }A[150000], B[350000];
17 inline bool operator < (const data &a, const data &b) {
18     return a.val > b.val;
19 }
20 int n, m, cas, tot;
21 inline ldb calc(void) {
22     ldb ret = 1E18, sum = 0;
23     lng now = 1, rem = m;
24     for (int i = n; i; --i)
25         sum += (B[i].cnt - 1) * B[i].val * (1 - B[i].val) + (1 - B[i].val) * B[i + 1].val, rem -= B[i].cnt;
26     for (int i = 1; i <= n; ++i ) {
27         rem -= B[i].cnt;
28         while (now <= n && rem <= 0)
29             sum -= (B[now].cnt - 1) * B[now].val * (1 - B[now].val) + (1 - B[now].val) * B[now + 1].val, rem += B[now++].cnt;
30         if (rem <= 0)break;
31         sum += (B[i].cnt - 1) * B[i].val * (1 - B[i].val) + (1 - B[i - 1].val) * B[i].val;
32         ret = min(ret, sum + (rem - 1) * B[now - 1].val * (1 - B[now - 1].val) + (1 - B[now - 1].val) * B[now].val + (1 - B[i].val) * B[now - 1].val);
33     }
34     rem = m, sum = 0;
35     for (int i = 1; i <= n; ++i) {
36         int mn = min(rem, (lng)B[i].cnt);
37         if(!mn)break; else rem -= mn, sum += (mn - 1) * B[i].val * (1 - B[i].val) + (1 - B[i - 1].val) * B[i].val;
38     }
39     return ret = min(ret, sum);
40 }
41 signed main(void) {
42     for (scanf("%d", &cas); cas--; ) {
43         scanf("%d%d", &n, &m);
44         for (int i = 1; i <= n; ++i) {
45             A[i].read(); if (!A[i].cnt)--i, --n;
46         }
47         sort(A + 1, A + n + 1); tot = 0;
48         for (int i = 1; i <= n; ++i) {
49             B[++tot] = data(1, A[i].val);
50             if (--A[i].cnt) {
51                 if (A[i].cnt > 1)
52                     B[++tot] = data(A[i].cnt - 1, A[i].val);
53                 B[++tot] = data(1, A[i].val);
54             }
55         }
56         B[0].val = 1, B[(n = tot) + 1].val = 0;
57         ldb ans = calc();
58         for (int i = 1; i <= n; ++i)
59             if (i < n + 1 - i)swap(B[i], B[n + 1 - i]);
60         for (int i = 1; i <= n; ++i)B[i].val = 1 - B[i].val;
61         ans = min(ans, calc());
62         printf("%.6lf\n", (double)fabs(ans));
63     }
64 }

@Author: YouSiki

转载于:https://www.cnblogs.com/yousiki/p/6490769.html

BZOJ 4030: [HEOI2015]小L的白日梦相关推荐

  1. bzoj 4031: [HEOI2015]小Z的房间

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1457  Solved: 736 [Submit][St ...

  2. bzoj 4031 [HEOI2015]小Z的房间

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 见TJ:https://blog.csdn.net/fromatp/article/d ...

  3. BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 题解: Matrix-tree定理解决生成树计数问题,其中用到高斯消元法求上三角矩 ...

  4. BZOJ 4031 HEOI2015 小Z的房间 Matrix-Tree定理

    题目大意:给定一张地图,求生成树个数 Matrix-Tree定理直接上 不过模数是 109 10^9,不能直接求逆元 因此消元的时候辗转相除一下就好了 #include <cstdio> ...

  5. BZOJ 4443: [Scoi2015]小凸玩矩阵

    二次联通门 : BZOJ 4443: [Scoi2015]小凸玩矩阵 /*BZOJ 4443: [Scoi2015]小凸玩矩阵本来以为是道数据结构题后来想了想发现不可做就考虑二分dp判断推方程推不出来 ...

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

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

  7. P4111 [HEOI2015]小Z的房间

    P4111 [HEOI2015]小Z的房间 题目描述 详见:P4111 [HEOI2015]小Z的房间 solution Matrix-Tree裸题. 题意为求一个有障碍的网格图的生成树个数. 因此对 ...

  8. 1526: 小L的项链切割

    原题链接:http://acm.zzuli.edu.cn/problem.php?id=1526 1526: 小L的项链切割 时间限制: 1 Sec  内存限制: 128 MB 题目描述 小T送给了小 ...

  9. BZOJ 1022 [SHOI2008]小约翰的游戏John

    title: 'BZOJ 1022 [SHOI2008]小约翰的游戏John' categories: BZOJ date: 2016-3-8 21:27:00 tags: [SG函数,博弈论] De ...

  10. 《趣味知识博文》小W与小L带你聊天式备考CDA Level Ⅰ(六)

    目录 作者简介 作者名:王小王-123 人物简介 二十模拟题 每文一语  本系列文章将会以通俗易懂的聊天对话方式,进行知识点的归纳和总结,对话中涵盖了知识点的主要逻辑结构,给人一种"清水出芙 ...

最新文章

  1. 学历案与深度学习电子书
  2. R语言包_knitr
  3. gcc/g++添加头文件目录和库文件目录
  4. 线结构光平面标定计算算子
  5. 微信平台全面封杀UBER的24小时里,优步做了什么
  6. torch中的topk()函数
  7. linux禁止修 5在线阅读,linux – 如何在不重新编译内核的情况下禁用CentOS 5.3中的nf_conntrack内核模块...
  8. hbasehlog_HBase原理--RegionServer核心组件之HLog
  9. 准备好所有应用程序以进行本地化
  10. 数字化定量分析_制造业走向数字化:企业以提高劳动生产率来优化供应链管理...
  11. 轻松搭建Windows8云平台开发环境
  12. 快解析 : 管家婆A8远程访问解决方案
  13. abaqus一维固结模拟
  14. rk3288 android 6.0固件,Firefly-RK3288主板烧写官方Android固件起不来
  15. npm 报错 426 Upgrade Required
  16. Solidworks直接打开SWB文件报错怎么办
  17. python appium连接安卓真机测试
  18. maven中实现代码单元测试覆盖率统计
  19. 最新的服务器cpu有国产的吗,浪潮发布国产飞腾CPU服务器 已达业界主流水平
  20. [转]JavaScript格式化代码程序

热门文章

  1. MYSQL索引优化(索引失效场景)
  2. Java结构型设计模式之装饰者模式
  3. JavaScript基础专题之执行上下文和执行栈(二)
  4. LeetCode--042--接雨水(java版)
  5. Rsync结合Inotify 实时同步配置
  6. IOS上路_10-简单示例-手势识别2-1
  7. cesium 漫游飞行_cesium 之三维漫游飞行效果实现篇(附源码下载)
  8. Android进程管理
  9. [AD19] 使用元器件向导为元件绘制PCB封装
  10. BZOJ3517 翻硬币