[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全栈工程师(递归函数、闭包)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细 ...
- 孤荷凌寒自学python第十七天初识Python的函数
孤荷凌寒自学python第十七天初识Python的函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 函数是能够完成指定运算并返回运算结果的代码块.是结构化编程重要的结构. 我首先发现pyt ...
- 【志银】NYOJ《题目860》又见01背包
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860 方法一:不用滚动数组(方法二为用滚动数组,为方法一的简化) 动态规划分析:最少要拿总 ...
- mongodb 部署
安装mongodb-3.4 1)将安装包上传至服务器 2)对压缩文件进行解压 tar -zxvf mongodb-linux-x86_64-suse12-v3.4-latest.tar.gz 3)把解 ...
- Oracle 数据库导出时 EXP-00008;ORA-00904
问题是客户端和服务器端版本问题,我本地是11g,而服务器端是10g. 规则1:低版本的exp/imp可以连接到高版本(或同版本)的数据库服务器,但高版本的exp/imp不能连接到低版本的数据库服务器. ...
- [转]mysql联合索引
mysql联合索引 命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https:/ ...
- Android 开发中Service完全解析
定义:服务,是Android四大组件之一,属于计算型组件 作用:提供 需在后台长期运行的服务 生命周期: 在Service的生命周期里,常用的有: (1) 4个手动调用的方法 手动调 ...
- flutter channel master
flutter可能是未来跨平台开发的又一技术框架,那么对于一个app,我们不可能完全用flutter来开发,那么就意味着我们需要在已有的Android和iOS代码中去集成flutter.目前这一技术还 ...
- 了解Spark源码的概况
本文旨在帮助那些想要对Spark有更深入了解的工程师们,了解Spark源码的概况,搭建Spark源码阅读环境,编译.调试Spark源码,为将来更深入地学习打下基础. 一.项目结构 在大型项目中,往往涉 ...
- joyOI 选课 【树形dp + 背包dp】
题目链接 选课 题解 基础背包树形dp #include<iostream> #include<cstdio> #include<cmath> #include&l ...