[HDU6240]Server
题目大意:
用$n$条线段覆盖区间$[1,t]$上的整点。每条线段有4个属性$(S_i,T_i,A_i,B_i)$,表示用第$i$条线段可以覆盖区间$[S_i,T_i]$。若选取线段的集合为$S$,最后总代价为$\frac{\sum_{i\in S}A_i}{\sum_{i\in S}B_i}$。问区间$[1,t]$全部覆盖时,最小代价为多少?
思路:
分数规划经典模型。
二分答案$k$,表示代价为$k$。若$k$为可行的,则我代价们需要找到一个合法的$S$,满足$\frac{\sum_{i\in S}A_i}{\sum_{i\in S}B_i}\leq k$。移项得$\sum_{i\in S}(A_ik-B_i)\geq 0$。
可以将所有线段按照左端点排序,然后考虑每个线段对答案的贡献。
若$A_ik-B_i\geq 0$,则选了这个线段肯定能够让答案尽可能大于$0$,因此把它选上。
如果把所有$A_ik-B_i\geq 0$的线段选上后能够覆盖完整个区间,那么$k$为可行的代价。
如果不能覆盖完,那么我们要考虑选上一些$A_ik-B_i<0$的线段,使得代价增加最少的情况下,能把区间覆盖完。
若用$sum$表示必选线段$A_ik-B_i$的和,$f_i$表示覆盖完$i$点后,$sum$要减少的值。那么对于必选线段$i$,$f_{r_i}=\min\{f_j\mid S_i\leq j\leq t\}$(选了以后并不会影响$sum$),对于其它线段,$f_{r_i}=\min\{f_j|S_i\leq j\leq t\}+B_i-A_ik$。由于$f_{r_i}$,可能会被计算多次,因此取最小值即可。转移的时候相当于后缀最小值,显然可以使用树状数组优化。最后只需要判断$sum-f_t\geq 0$即可。
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
const double eps=1e-,inf=1e10;
struct Node {
int l,r,w,a;
bool operator < (const Node &another) const {
return l<another.l||(l==another.l&&r<another.r);
}
};
Node node[N];
int n,m;
struct SuffixFenwickTree {
double val[N];
int lowbit(const int &x) const {
return x&-x;
}
void reset() {
for(register int i=;i<=m;i++) {
val[i]=-inf;
}
}
void modify(int p,const double &x) {
while(p) {
val[p]=std::max(val[p],x);
p-=lowbit(p);
}
}
double query(int p) const {
if(!p) return ;
double ret=-inf;
while(p<=m) {
ret=std::max(ret,val[p]);
p+=lowbit(p);
}
return ret;
}
};
SuffixFenwickTree t;
inline bool check(const double &k) {
t.reset();
int last=;
for(register int i=;i<=n;i++) {
if(node[i].a*k-node[i].w<) continue;
if(node[i].l-<=last) last=std::max(last,node[i].r);
}
if(last>=m) return true;
double sum=;
t.modify(last,);
for(register int i=;i<=n;i++) {
if(node[i].a*k-node[i].w<) {
t.modify(node[i].r,t.query(node[i].l-)+node[i].a*k-node[i].w);
} else {
sum+=node[i].a*k-node[i].w;
t.modify(node[i].r,t.query(node[i].l-));
}
}
return sum+t.query(m)>=;
}
int main() {
for(register int T=getint();T;T--) {
n=getint(),m=getint();
int sumw=,suma=;
for(register int i=;i<=n;i++) {
const int l=getint(),r=getint(),w=getint(),a=getint();
sumw+=w,suma+=a;
node[i]=(Node){l,r,w,a};
}
std::sort(&node[],&node[n+]);
double l=,r=sumw*./suma;
while(r-l>=eps) {
const double mid=(l+r)/;
(check(mid)?r:l)=mid;
}
printf("%.3f\n",r);
}
return ;
}
[HDU6240]Server的更多相关文章
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
随机推荐
- 珍藏版 Python 开发工程师面试试题
珍藏版 Python 开发工程师面试试题 说明:不拿到几家公司的offer,那就是卑鄙的浪费 一.Python_基础语法 1.可变与不可变类型: 2.浅拷贝与深拷贝的实现方式.区别:deepcopy如 ...
- springboot08 jdbc
一.JDBC&连接池 1. jdbc介绍 JDBC(Java DataBase Connectivity ,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数 ...
- Python-有名匿名函数、列表推导式
介绍: 匿名函数: 匿名函数用lambda关键词能创建小型匿名函数.这种函数得名于省略了用def声明函数的标准步骤,节省开辟空间. 列表推导式: 有名函数 #1.有名函数(初始) def squ ...
- linux备忘录-文件系统管理
Extx 文件系统原理 block group 每个分区(partition)的组成为 boot sector -> block group -> block group -> bl ...
- 删除maven仓库中的lastUpdate文件
使用idea时导入hibernate 5.1.0的jar包,然后发现本地仓库中找不到该版本的jar 然后手贱 alt+enter 发现提示 update maven indices 然后以为更新就会好 ...
- Java TCP通信概念及实例
TCP/UDP 协议 通俗解释: TCP协议和UDP协议的区别类似于电话系统和邮政系统. <1>TCP:类似于电话系统,建立双向的通信通道,确定连接,话音顺序接听. <2>UD ...
- 软工实践 - 第十六次作业 Alpha 冲刺 (7/10)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10013959.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...
- 第八篇:python基础_8 面向对象与网络编程
本篇内容 接口与归一化设计 多态与多态性 封装 面向对象高级 异常处理 网络编程 一. 接口与归一化设计 1.定义 (1)归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了 ...
- 【bzoj2506】calc 根号分治+STL-vector+二分+莫队算法
题目描述 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. 输入 第一行两个正整数n ...
- thinkPHP判断是否修改成功
thinkPHP中使用save方法来更新数据的save方法的正常执行时返回值是影响的记录数,出错时返回false,返回为0和返回false在很多业务场景下都是不同的. 而当修改的内容和原有内容一致的时 ...