CQOI2012]组装

solution:

博主并不会模拟退火,所以用了差分数组加贪心吗。我们先来看题:

  1. 在数轴上的某个位置修建一个组装车间
  2. 到组装车间距离的平方的最小值。
  3. 1<=n<=20000

心路历程:

  1. 在一条直线上
  2. 距离的平方?(二次函数?)
  3. 1<=n<=10000?(nlogn(logn.....)?)

嗯?乍一看还真不知道怎么做啊!

可是在x轴上?还要距离的平方,好像几个二次函数加一起还是二次函数来着?

莫非?这整体就是一个单峰函数?

好吧,零件种类有多种,但(既然是平方)应该还是要从二次函数出手吧。

既然每种物资只能选一个的话那干脆写一个分段函数吧。|xi|<=200000,他给的又是整形,分界点最多只有400000个,好像可行

所以:

贪心:它的范围是-100000~100000,但如果我们将一个零件看成一个二次函数,数轴看成x轴,因为他们都是平方,每个零件所构成的函数都是 $ y={(x+k)}^2 $ 的形式(k表示零件在数轴上的位置)。

所以对于每一类零件,建立一个坐标轴,将零件画成二次函数的形式,这样对于每一个x值,我们贪心的选y值最小的那个零件。这样就能构成一个分段函数,而我们将每一种类的零件所构成的分段函数放在一起(用差分数组维护 $ y=ax^2+bx+c $ 中的b与c),几个二次函数加一起还是二次函数,虽然分的段特别多,但绝对在我们的承受范围内,然后我们用二次函数求最小值的公式把最小值求出来即可(最小值可以在段外!!!)

零件位置给的是整形,分段的点的小数部分绝对为0或0.5,我们在差分数组前先处理一下(乘个二,加上200001,避免负数)(当然!你也可以用莫对思想维护!(比如鸽王发的那篇题解))

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define db double
#define rg register int
using namespace std;
struct su{
int x,y;
}t[200005]; int n,m,l,r;
ll s[800015];
ll v,k[800015];//请不要吝啬您的long long和double
db a,b,c,res=(ll)1<<50,ans,tot;//res初值赋大些 inline bool cmp(su x,su y){
return x.y==y.y?x.x<y.x:x.y<y.y;
} int main(){
//freopen("battle.in","r",stdin);
//freopen("battle.out","w",stdout);
cin>>n>>m;a=n;
for(rg i=1;i<=m;++i)
cin>>t[i].x>>t[i].y;
sort(t+1,t+m+1,cmp);
for(rg i=1;i<=m;++i){
if(t[i].y!=t[i-1].y)l=1;
else l=t[i].x+t[i-1].x+400001;
if(t[i].y!=t[i+1].y)r=800002;
else r=t[i].x+t[i+1].x+400001;
v=-2*t[i].x;s[l]+=v;s[r]-=v;
v>>=1;v=v*v;k[l]+=v;k[r]-=v;
}
for(rg i=1;i<=800001;++i){
b=b+s[i];c=c+k[i];tot=c-(b*b)/(4*a);
if(tot<res)res=tot,ans=-b/(2*a);
}printf("%.4lf",ans);
return 0;
}

[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. Luogu3162 CQOI2012 组装 贪心

    传送门 如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是 \(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i ...

  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. Tomcat server.xml中Connector配置参数详解

    Tomcat中Connector常用配置 Tomcat中server.xml有些配置信息是需要我们了解的,最起码知道如何进行简单的调试. <Connector port="8080&q ...

  2. maven编译的时候跳过test

    方式1:用命令带上参数 mvn install -Dmaven.test.skip=true 方式2:在pom.xml里面配置 <plugin> <groupId>org.ap ...

  3. BZOJ5010 FJOI2017矩阵填数(容斥原理)

    如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...

  4. JS中Number(),parseInt(),parseFloat()和自动类型转换

    [参考来源] https://www.cnblogs.com/yi0921/p/6196841.html https://blog.csdn.net/u010200222/article/detail ...

  5. pandas merge

    merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. merge的参数 on:列名,join用来对齐的那一列的 ...

  6. 装VS2012失败

    有一种可能的问题是:注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_R ...

  7. 【loj3054】【hnoi2019】鱼

    题目 描述 ​ 难以描述.......慢慢看..: ​ https://loj.ac/problem/3054 范围 ​ $6 \le n \le 1000  ,  1 \le |x| , |y| \ ...

  8. Linux运行Java出现“Exception in thread "main" java.lang.OutOfMemoryError: Java heap space”报错

    在运行如下程序时出现“Exception in thread "main" java.lang.OutOfMemoryError: Java heap space”报错: java ...

  9. 02-css的选择器

    css的选择器:1.基本选择器 2.高级选择器 基本选择器包含: 1.标签选择器 标签选择器可以选中所有的标签元素,比如div,ul,li ,p等等,不管标签藏的多深,都能选中,选中的是所有的,而不是 ...

  10. pyglet -- 视频播放器 (简单实现,效果不是太好,切换资源会卡死)(三)

    实现一个简单的视频播放器,效果不是很好.这里不多说,直接贴代码了. #-*- coding:gbk -*- import pyglet import os from pyglet.gl import ...