Luogu3162 CQOI2012 组装 贪心
如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是
\(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i^2\)
而显然的一点,提供某一种零件的生产车间一定会是\(|x-a_i|\)最小的那个\(i\),所以如果一个生产车间\(i\)会向组装车间提供零件,那么对应的\(x\)会在一段区间之内。
把这些区间拿出来,从左往右扫一遍,这个过程中记录提供每一种零件的生产车间的变化并动态维护\(\sum a_i\)、\(\sum a_i^2\)以及\(x\)的取值范围,这样就可以算出当前状态下组装车间的最优选址。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<stack>
#include<vector>
#include<cmath>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return f ? -a : a;
}
#define ld long double
#define PLI pair < ld , int >
const int MAXN = 10010;
vector < int > lj[MAXN];
int N , M , p[MAXN];
priority_queue < PLI > q;
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
N = read();
M = read();
ld pre = -1e40 , cur = -1e40 , sum = 0 , pfh = 0 , ans = 1e40 , minInd;
for(int i = 1 ; i <= M ; ++i){
int a = read() , b = read();
lj[b].push_back(a);
}
for(int i = 1 ; i <= N ; ++i){
sum += lj[i][0];
pfh += 1ll * lj[i][0] * lj[i][0];
if(lj[i].size() > 1)
q.push(PLI(-(lj[i][1] + lj[i][0]) / 2.0 , i));
}
while(!q.empty()){
PLI t = q.top();
q.pop();
pre = cur;
cur = -t.first;
int i = t.second;
ld minN = sum / N;
if(pre > minN){
if(ans > N * pre * pre - 2 * sum * pre + pfh){
ans = N * pre * pre - 2 * sum * pre + pfh;
minInd = pre;
}
}
else
if(cur < minN){
if(ans > N * cur * cur - 2 * cur * sum + pfh){
ans = N * cur * cur - 2 * cur * sum + pfh;
minInd = cur;
}
}
else
if(ans > (N * pfh - sum * sum) / N){
ans = (N * pfh - sum * sum) / N;
minInd = minN;
}
sum -= lj[i][p[i]];
pfh -= 1ll * lj[i][p[i]] * lj[i][p[i]];
sum += lj[i][++p[i]];
pfh += 1ll * lj[i][p[i]] * lj[i][p[i]];
if(p[i] + 1 != lj[i].size())
q.push(PLI(-(lj[i][p[i] + 1] + lj[i][p[i]]) / 2.0 , i));
}
pre = cur;
cur = 1e40;
ld minN = sum / N;
if(pre > minN){
if(ans > N * pre * pre - 2 * sum * pre + pfh){
ans = N * pre * pre - 2 * sum * pre + pfh;
minInd = pre;
}
}
else
if(cur < minN){
if(ans > N * cur * cur - 2 * cur * sum + pfh){
ans = N * cur * cur - 2 * cur * sum + pfh;
minInd = cur;
}
}
else
if(ans > (N * pfh - sum * sum) / N){
ans = (N * pfh - sum * sum) / N;
minInd = minN;
}
cout << fixed << setprecision(4) << minInd;
return 0;
}
Luogu3162 CQOI2012 组装 贪心的更多相关文章
- [CQOI2012]组装 贪心
[CQOI2012]组装 贪心好题. LG传送门 首先有一个必须要能推的式子:设第\(i\)种零件选的生产车间位置为\(x _ i\),组装车间位置为\(x\), 则总的花费为 \[f(x) = \s ...
- 【BZOJ2666】[cqoi2012]组装 贪心
[BZOJ2666][cqoi2012]组装 Description 数轴上有m个生产车间可以生产零件.一共有n种零件,编号为1~n.第i个车间的坐标为xi,生产第pi种零件(1<=pi< ...
- [CQOI2012]组装 (贪心)
CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...
- luogu P3162 [CQOI2012]组装
传送门 mdzz,为什么这题有个贪心的标签啊qwq 首先考虑每一种车间,对于每相邻两个车间,在中点左边那么左边那个会贡献答案,在右边就右边那个更优 所以总共会有m-1个这样的分界中点,然后最多有m+1 ...
- BZOJ 2666: [cqoi2012]组装
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666 题意:n种零件,m个位置,每个位置有一种零件.求一个位置x,使得cost(1 ...
- P3162 [CQOI2012]组装
传送门 退火大法好 我并不会正解于是只好打退火了--其他没啥好讲--只要对每一种颜色开一个vector,存一下所有这个颜色的位置,判定的时候可以去所有的颜色里二分找到前缀和后缀,把和当前点距离小的加入 ...
- 【题解】P3162CQOI2012组装
[题解][CQOI2012]组装 考虑化为代数的形式,序列\(\left[a_i \right]\)表示选取的\(i\)种类仓库的坐标. \(ans=\Sigma(a_i-x)^2,(*)\),展开: ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [BZOJ2667][cqoi2012]模拟工厂 贪心
2667: [cqoi2012]模拟工厂 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 367 Solved: 184[Submit][Status] ...
随机推荐
- Linux 磁盘分区方案简析
Linux 磁盘分区方案简析 by:授客 QQ:1033553122 磁盘分区 任何硬盘在使用前都要进行分区.硬盘的分区有两种类型:主分区和扩展分区.一个硬盘上最多只能有4个主分区,其中一个主分区 ...
- Angular基础(四) 创建Angular应用
应用(Application)是由组件构成的树.树的根部是最顶层的组件即应用本身,启动的时候,浏览器会最先渲染顶层组件,然后根据树形结构,迭代渲染子组件.组件是可装配的,可以互相组合以构成更大的组件. ...
- Java:[面向对象:继承,多态]
本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类( ...
- python包中__init__.py的作用
1.__init__.py定义包的属性和方法 一般为空文件,但是必须存在,没有__init__.py表明他所在的目录只是目录不是包 2.导入包的时候使用 例如有一个test目录,test下有xx1.p ...
- 修改sqlserver2008数据库的排序规则 (转)
修改sqlserver2008数据库的排序规则 (转) 修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL S ...
- 3.1Python数据处理篇之Numpy系列(一)---ndarray对象的属性与numpy的数据类型
目录 目录 (一)简单的数组创建 1.numpy的介绍: 2.numpy的数组对象ndarray: 3.np.array(list/tuple)创建数组: (二)ndarray对象的属性 1.五个常用 ...
- MDX 脚本语句 -- Scope
在多维表达式 (MDX) 中,下列语句用于管理 MDX 脚本中的上下文.作用域和流控制. 主题 说明 calculate语句 计算子多维数据集,还可以确定子多维数据集中所包含的求解次序 case语句 ...
- 怎样从本地删除git远程仓库里面的文件
git是大家通用的一种版本控制系统,便捷高效,各种命令需要牢记,今天小渔介绍给大家的是git的删除命令,即将文件从远程仓库中删除的操作. 方法/步骤 首先,我们打开自己的本地GIT仓库,在根目 ...
- svn 更新
dev更新流程: 1.打开软件,文件—>打开,弹出右边对话框链接dev地址 2.在窗口输入cd /var/www/user 回车 3.输入svn up 则更新dev代码完成 本地提交到 ...
- 线程间的通信_多生产者多消费者问题_JDK1.5新特性_Lock
对于同步代码块,对于锁的操作是隐式的但是在JDK1.5之前的这种方法效率有点低,判断会很多,后面升级之后有新的解决方案 jdk1.5以后将同步和锁封装成了对象,并将操作锁的隐式方式定义到了该对象中,将 ...