题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4030

sol  :orz Yousiki http://www.cnblogs.com/yousiki/p/6490769.html

   orz jiry http://jiruyi910387714.is-programmer.com/posts/90425.html

   有三个结论:

     1、一定存在一个最优解,使得每天不高兴的概率单调递增

        这个结论很显然,考虑对于一组逆序对将其交换,答案更优

     2、一定存在最优解,由排序后的一段前缀+一段后缀构成

        如果把前缀一个点放到中间比原来优,那么把这个点放到后面一定更优(或者一样)

     3、每一种选取的项目有三种可能:选一个,全选,其他,且第三种至多一个

        这个不会证QAQ,Yousiki大佬说随便想想就知道了QAQ

   这样的话就可以假设第三种情况在后缀(前后缀分别做一次),

   线性往后扫前缀,每次向后跳一个块,考虑后缀的期望会怎么更新,再处理一个快+1的情况即可

   可以把一个点拆成三个:1,cnt,1,这样写起了方便一些,不用再特判

   代码莫名其妙数据一大就WA.......完全不知道为什么QAQ,弃疗了,cogs最后一个点还莫名其妙过了....50points

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define inf 1e18
#define double long double
#define int long long
using namespace std;
const int Mx=;
struct Node { int c; double p,w; } A[*Mx],tmp[Mx];
bool cmp(Node a,Node b) { return a.p>b.p; }
int n,k,tot,now,sigma;
double ans,sum;
void solve()
{
sum=,now=,sigma=k;
for(int i=n;i>=;i--) sum+=(A[i].c-)*A[i].w+(-A[i].p)*A[i+].p,sigma-=A[i].c;
for(int i=;i<=n;i++)
{
sigma-=A[i].c;
while(now<=n&&sigma<=) sum-=(A[now].c-)*A[now].w+(-A[now].p)*A[now+].p,sigma+=A[now++].c;
if(sigma<=) break; sum+=(A[i].c-)*A[i].w+(-A[i-].p)*A[i].p;
ans=min(ans,sum+(sigma-)*A[now-].w+(-A[now-].p)*A[now].p+(-A[i].p)*A[now-].p);
}
sigma=k,sum=;//初始状态
for(int i=,mn=min(sigma,A[i].c);i<=n&&mn;i++)
sigma-=mn,sum+=(mn-)*A[i].w+(-A[i-].p)*A[i].p;
ans=min(ans,sum);
}
signed main()
{
int T; scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
for(int i=,x,y;i<=n;i++)
scanf("%lld/%lld%lld",&x,&y,&tmp[i].c),tmp[i].p=(double) x/y,tmp[i].w=(-tmp[i].p)*tmp[i].p;
sort(tmp+,tmp++n,cmp); tot=;
for(int i=;i<=n;i++)//拆点
{
if(tmp[i].c==) A[++tot]=tmp[i];
if(tmp[i].c>) A[++tot]=tmp[i],A[tot].c=,A[++tot]=tmp[i],A[tot].c--;
if(tmp[i].c>) A[tot].c--,A[++tot]=tmp[i],A[tot].c=;
} n=tot;
ans=inf,A[].p=,A[n+].p=;
solve();
for(int i=;i<=(n+)/;i++) A[i].p=-A[i].p,A[n-i+].p=-A[n-i+].p,swap(A[i],A[n-i+]);
solve();
printf("%.6LF\n",fabs(ans));
}
}

bzoj4030【HEOI2015】小L的白日梦的更多相关文章

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

    [BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...

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

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

  3. HEOI2015小L的白日梦

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

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

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

  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. js数据结构处理--------扁平化数组处理为树结构数据

    将扁平化的数组处理为树结构数据,我们可以利用对象来处理,对象的复制是浅拷贝,指向相同的内存地址: var arr = [ { id: 0, pid: -1, name: 'sadas' }, { id ...

  2. Oracle 字符串处理函数

    字符串处理函数 ① substr(string,a,b)/substr(string,a) string 为字符串,string 表示需要截取的字符串. a.b 均为整型数字,a 表示开始截取的位置, ...

  3. 去除select下拉框默认样式

    去除select下拉框默认样式 select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #; /*很关键:将默认的select选 ...

  4. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  5. SPOJ1043 GSS1(线段树)

    题意 给出$n$个数,每次询问区间$(l, r)$内最大字段和 Sol 在合并子树的时候,答案仅有四种情况 打四个标记维护即可 查询同理,用类似update的方式合并 注意查询的时候不能按照以前的方式 ...

  6. 4-8 string

    1.常用的string模块 import string # 26个小写字母 print(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz # 2 ...

  7. Linux 系统性能

    Linux:PS命令详解与使用   要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程 ...

  8. PHP PDO 使用类

    PDO类 <?php class MYPDO { protected static $_instance = null; protected $dbName = ''; protected $d ...

  9. JZOJ 5771. 【NOIP2008模拟】遨游

    5771. [NOIP2008模拟]遨游 (File IO): input:trip.in output:trip.out Time Limits: 2000 ms  Memory Limits: 2 ...

  10. [译]The Python Tutorial#2. Using the Python Interpreter

    [译]The Python Tutorial#Using the Python Interpreter 2.1 Invoking the Interpreter Python解释器通常安装在目标机器的 ...