题意: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. PAT (Advanced Level) Practise - 1094. The Largest Generation (25)

    http://www.patest.cn/contests/pat-a-practise/1094 A family hierarchy is usually presented by a pedig ...

  2. RabbitMQ使用教程(五)如何保证队列里的消息99.99%被消费?

    1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用 ...

  3. C#创建和使用ActiveX组件

    开发基于.Net平台上的程序员是很难从本质上把Visual C#和ActiveX组件联起来,虽然在使用Visual C#开发应用程序时,有时为了快速开发或者由于.Net FrameWork SDK的不 ...

  4. curl_easy_setopt函数介绍

    本节主要介绍curl_easy_setopt中跟http相关的参数.注意本节的阐述都是以libcurl作为主体,其它为客体来阐述的. 1.     CURLOPT_URL 设置访问URL 2.     ...

  5. CentOS7下Mysql5.7安装

    下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.no ...

  6. git线上线下冲突

    今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...

  7. 二十七、MySQL 复制表

    MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的. 本章节将为大家介绍如何完 ...

  8. python读取xls文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/17 14:41 # @Author : Sa.Song # @Desc ...

  9. linux下查找文件命令总结

    主要有find,locate,whereis,which等 1. find是最常用也是最强大的查找命令,它可以查找任何类型的文件. find命令的一般格式为:find <指定目录>< ...

  10. CodeForces 781D Axel and Marston in Bitland DP

    题意: 有一个\(n\)个点\(m\)条边的无向图,边有两种类型,分别用\(0\)和\(1\)标识 因此图中的任意一条路径都对应一个\(01\)字符串 定义一个无限长的字符串\(s\): 开始令\(s ...