luogu P3162 [CQOI2012]组装
mdzz,为什么这题有个贪心的标签啊qwq
首先考虑每一种车间,对于每相邻两个车间,在中点左边那么左边那个会贡献答案,在右边就右边那个更优
所以总共会有m-1个这样的分界中点,然后最多有m+1个(头尾也算)区间,满足在区间内选点其他的贡献答案的车间是固定的
假设贡献答案的车间是固定的,考虑拆答案柿子\(\sum_{i=1}^{n}(x-x_i)^2=nx^2-2x\sum x_i+\sum {x_i}^2\),就是二次函数求区间最小值
然后从左往右扫,维护\(\sum x_i\)和\(sum {x_i}^2\)救星了
#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register
using namespace std;
const int N=2e5+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
LL a[N];
int b[N],bk[N];
struct node
{
int i,j;
bool operator < (const node &bb) const {return a[i]+a[j]<a[bb.i]+a[bb.j];}
}qq[N];
int n,m,q;
db ma=1e20,ans,na,nb,nc;
il void gmin(db a,db b,db c,db l,db r)
{
if(a*l*l+b*l+c<ma) ma=a*l*l+b*l+c,ans=l;
db x=-b/a/2;
if(x>=l&&x<=r&&a*x*x+b*x+c<ma) ma=a*x*x+b*x+c,ans=x;
}
int main()
{
n=rd(),m=rd();
for(int i=1;i<=m;++i)
{
a[i]=rd(),b[i]=rd();
if(bk[b[i]]) qq[++q]=(node){bk[b[i]],i};
else nb-=2*a[i],nc+=(db)a[i]*a[i];
bk[b[i]]=i;
}
sort(qq+1,qq+q+1);
a[0]=-1e9,a[m+1]=1e18,a[m+2]=a[m+1]+1;
qq[++q]=(node){m+1,m+1},qq[q+1]=(node){m+2,m+2};
na=n;
for(int i=1,j=1;i<=q;i=j)
{
db l=(db)(a[qq[i-1].i]+a[qq[i-1].j])/2,r=(db)(a[qq[j].i]+a[qq[j].j])/2;
while(!(qq[i]<qq[j]))
{
gmin(na,nb,nc,l,r);
nb+=2*a[qq[j].i],nc-=(db)a[qq[j].i]*a[qq[j].i];
nb-=2*a[qq[j].j],nc+=(db)a[qq[j].j]*a[qq[j].j];
++j;
}
}
printf("%.4lf\n",ans);
return 0;
}
luogu P3162 [CQOI2012]组装的更多相关文章
- P3162 [CQOI2012]组装
传送门 退火大法好 我并不会正解于是只好打退火了--其他没啥好讲--只要对每一种颜色开一个vector,存一下所有这个颜色的位置,判定的时候可以去所有的颜色里二分找到前缀和后缀,把和当前点距离小的加入 ...
- [CQOI2012]组装 (贪心)
CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...
- [CQOI2012]组装 贪心
[CQOI2012]组装 贪心好题. LG传送门 首先有一个必须要能推的式子:设第\(i\)种零件选的生产车间位置为\(x _ i\),组装车间位置为\(x\), 则总的花费为 \[f(x) = \s ...
- 【BZOJ2666】[cqoi2012]组装 贪心
[BZOJ2666][cqoi2012]组装 Description 数轴上有m个生产车间可以生产零件.一共有n种零件,编号为1~n.第i个车间的坐标为xi,生产第pi种零件(1<=pi< ...
- BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...
- BZOJ 2666: [cqoi2012]组装
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666 题意:n种零件,m个位置,每个位置有一种零件.求一个位置x,使得cost(1 ...
- Luogu3162 CQOI2012 组装 贪心
传送门 如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是 \(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i ...
- LUOGU P3161 [CQOI2012]模拟工厂 (贪心)
传送门 解题思路 贪心,首先因为\(n\)比较小,可以\(2^n\)枚举子集.然后判断的时候就每次看后面的如果用最大生产力生产能不能达成目标,解一个二次函数. 代码 #include<iostr ...
- 【题解】P3162CQOI2012组装
[题解][CQOI2012]组装 考虑化为代数的形式,序列\(\left[a_i \right]\)表示选取的\(i\)种类仓库的坐标. \(ans=\Sigma(a_i-x)^2,(*)\),展开: ...
随机推荐
- SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...
- Flask 自定义过滤器多个参数传入
非完整HTML文件: <div class="container" style="margin-top:50px;"> <div class= ...
- script id
Script中的id还是有用的,比如如果页面需要加载的JS文件过多,那样最好是写一个JS文件用来加载这些JS文件 require: function(libraryName){ document.wr ...
- JAVA基础语法 我的学习记录
1.标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线( ...
- io系列之其他类
一.File类:将文件或者文件夹封装成对象. 方便对文件和文件夹的属性信息进行操作. File对象可以作为参数传递给流的构造函数. 注意: 文件夹名称也可带有扩展名. 构造函数: File(Strin ...
- Day6--Python--小数据池和再谈编码
一.小数据池 参考 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存: int, str, bool int: 缓存范围 -5~256 str: 1. 长度小于等于1,直接缓 ...
- 开发问题及解决--java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...
- angular中因异步问题产生的错误解决方法
方法一 private userTaskList(){ let auth = this.make_basic_auth("kermit","kermit"); ...
- CodeForces12D 树状数组降维
http://codeforces.com/problemset/problem/12/D 题意 给N (N<=500000)个点,每个点有x,y,z ( 0<= x,y,z <=1 ...
- Redis之Transactions(事物)
你问我Redis支不支持事物?告诉你,Redis对事物的支持是部分支持(对比关系型数据库,没有强一致性) 定义:一个队列.一次性.顺序的.排他性的执行一系列命令 常用命令: DISCARD 取消事物, ...