传送门


如果提供每一种零件的生产车间固定了,那么总时间\(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 组装 贪心的更多相关文章

  1. [CQOI2012]组装 贪心

    [CQOI2012]组装 贪心好题. LG传送门 首先有一个必须要能推的式子:设第\(i\)种零件选的生产车间位置为\(x _ i\),组装车间位置为\(x\), 则总的花费为 \[f(x) = \s ...

  2. 【BZOJ2666】[cqoi2012]组装 贪心

    [BZOJ2666][cqoi2012]组装 Description 数轴上有m个生产车间可以生产零件.一共有n种零件,编号为1~n.第i个车间的坐标为xi,生产第pi种零件(1<=pi< ...

  3. [CQOI2012]组装 (贪心)

    CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...

  4. luogu P3162 [CQOI2012]组装

    传送门 mdzz,为什么这题有个贪心的标签啊qwq 首先考虑每一种车间,对于每相邻两个车间,在中点左边那么左边那个会贡献答案,在右边就右边那个更优 所以总共会有m-1个这样的分界中点,然后最多有m+1 ...

  5. BZOJ 2666: [cqoi2012]组装

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666 题意:n种零件,m个位置,每个位置有一种零件.求一个位置x,使得cost(1 ...

  6. P3162 [CQOI2012]组装

    传送门 退火大法好 我并不会正解于是只好打退火了--其他没啥好讲--只要对每一种颜色开一个vector,存一下所有这个颜色的位置,判定的时候可以去所有的颜色里二分找到前缀和后缀,把和当前点距离小的加入 ...

  7. 【题解】P3162CQOI2012组装

    [题解][CQOI2012]组装 考虑化为代数的形式,序列\(\left[a_i \right]\)表示选取的\(i\)种类仓库的坐标. \(ans=\Sigma(a_i-x)^2,(*)\),展开: ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. [BZOJ2667][cqoi2012]模拟工厂 贪心

    2667: [cqoi2012]模拟工厂 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 184[Submit][Status] ...

随机推荐

  1. 【读书笔记】iOS-强类型与弱类型

    id类型是一个通用类型,OC使用id表示任意类型的对象,它可以作为一个占位符表示这是一个不确定的类型的对象或者引用.因此,所有的对象都 可以用id来表示.这很有用,想象一下,如果你需要实现一个通用的链 ...

  2. for each....in、for in、for of

    一.一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i) { console.log(i,a ...

  3. Html/Css 初步认识笔记

    1.什么是 HTML ? HTML(HyperText Markup Language) 的学名是超文本标记语言. 标记用来表示网页内容要如何显示,自身不显示 .<我就是标记> 标记成对出 ...

  4. WEB服务器----Apache 安装配置

    1.官网下载需要的安装包(包括主安装包和依赖包的下载)可以直接使用Linux的wget进行下载: httpd安装包下载地址:http://mirrors.hust.edu.cn/apache//htt ...

  5. 反编译Apk得到Java源代码

    原文章转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 本人转载自:ht ...

  6. Android开发常用的一些功能列表(转)

    文章来源:http://www.cnblogs.com/netsql/archive/2013/03/02/2939828.html 1.软件自动更新下载,并提示 2.软件登录注册,以及状态保存 3. ...

  7. MVC与单元测试实践之健身网站(完)-备案与部署

    主页-http://www.zhixin9001.cn/Home/Introduce GitHub- https://github.com/zhixin9001/Fitness 这是关于Fit网站的最 ...

  8. Expo大作战(二十九)--expo sdk api之registerRootComponent(注册跟组件),ScreenOrientation(屏幕切换),SecureStore,

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  9. CSS3创建圆圈进度条

    最近在工作中需要做一个圆圈倒计时,刚开始的想法是做个纯数字的倒计时即可,可是需求觉得这个不太好看,想加个倒计时进度条.于是就有了接下来的分析过程... 我们知道CSS3可以很方便的画圆,圆环,然后在加 ...

  10. [20180718]拷贝数据文件从dg库.txt

    [20180718]拷贝数据文件从dg库.txt 1.测试环境:SCOTT@book> @ ver1PORT_STRING                    VERSION        B ...