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] ...
随机推荐
- 【工具相关】Web-Sublime Text2-安装 Package Control
一,打开Sublime text2---->Preferences--->若Package Settings,Package Control,没有的话,就需要安装Package Contr ...
- 视觉slam领域经典综述和具体应用场景
一.经典综述文章 1. Durrant-Whyte H, Bailey T. Simultaneous localization and mapping: part I[J]. IEEE robot ...
- Vue Router滚动行为 scrollBehavior
滚动行为 使用前端路由,当切换到新路由时,想要页面滚动到顶部或者是保持原先的滚动位置,就像重新加载页面那样. vue-router能做到,而且更好,它让你可以自定义路由切换时页面如何滚动. 注意:这个 ...
- Salesforce的站点和社区
社区 Salesforce提供了"社区"功能.建立一个"社区"相当于建立一个前端的网站,让用户.客户.其他合作伙伴等浏览并使用其中的内容. 启用Salesfor ...
- 常用的Git命令整理
之前一直忙于项目苦于没有时间总结,今天刚好有时间特来总结一下在工作中常用到的代码版本管理器Git.至于为什么要用Git?Git相比SVN有哪些好处?我就不多说了,前人已经总结的很好.今天主要介绍的是常 ...
- LeetCode题解之 Find Mode in Binary Search Tree
1.题目描述 2.问题分析 使用map记录元素出现的次数. 3.代码 vector<int> v; map<int,int> m; vector<int> find ...
- 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome
给 Linux 系统"减肥",系统垃圾清理 2013/10/16 linux 系统安装与配置管理 评论 15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...
- Spark程序数据结构优化
场景: 1.scala中的对象:对象头是16个字节(包含指向对象的指针等源数据信息),如果对象中只有一个int的属性,则会占用20个字节,也就是说对象的源数据占用了大部分的空间,所以在封装数据的时候尽 ...
- What To Do When MySQL Runs Out of Memory: Troubleshooting Guide
In this article, I will show you how to use the new version of MySQL (5.7+) and how to troubleshoot ...
- 非对称加密与GPG/PGP
最近浏览博客的时候,经常会看到博主展示出自己的公钥,于是对 GPG/PGP 产生兴趣.下面简单记录相关文章的链接,方便以后了解. 简介: 1991年,程序员Phil Zimmermann为了避开政府的 ...