【题解】P3162CQOI2012组装
【题解】[CQOI2012]组装
考虑化为代数的形式,序列\(\left[a_i \right]\)表示选取的\(i\)种类仓库的坐标。
\(ans=\Sigma(a_i-x)^2,(*)\),展开:
\(ans=nx^2-2\Sigma a_ix+\Sigma a_i^2(**)\)
(*)是二次函数看到没?初中填空题第一题。最小值的对称轴\(\frac{\Sigma a_i}{n}\)。
至于选取\(a_i\),根据(*)贪心选取\(a_i\)即可,(意思就是选近的)。
考虑用莫队的形式维护\(\Sigma a_i\)和\(\Sigma a_i^2\),把复杂度降到\(O(n)\)
我们假设仓库在所有点的左侧,我们先把所有颜色最靠左的点选中。
然后仓库慢慢右移
考虑枚举变化点,需要选取的\(a_i\)变化,当且仅当我们假定的仓库的位置越过了相邻的相同种类的中点(根据(*)式),把变化的信息记录下来像莫队一样的加入待处理的队列,每次改变直接根据二次函数的性质查询最小值和对称轴就好了。
至于有时候对称轴可能不在我们假定的仓库位置,没关系,我们的目的是取到最小值,只关心(**)式的系数,不关心实际位置。
看不懂解释就看代码就好了,但是那两个式子一定要理解。
复杂度是上限是\(sort\)导致的,最后的时间复杂度是\(O(nlogn)\)。
考场代码(没开\(long\) \(long\)见了三十分祖宗)
#include<bits/stdc++.h>
#define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t)
#define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t)
#define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define pushup(x) seg[(x)]=seg[(x)<<1]+seg[(x)<<1|1]
#define midd register int mid=(l+r)>>1
#define chek if(R<l||r<L)return
#define TMP template<class ccf>
#define rgt L,R,mid,r,pos<<1|1
#define lef L,R,l,mid,pos<<1
#define all 1,n,1
using namespace std;typedef long long ll;
TMP inline ccf qr(ccf k){
char c=getchar();
ccf x=0;
int q=1;
while(c<48||c>57)q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxn=2e4+15;
ll ai2,ai;
vector < int > p[maxn];
struct node{
int id,pos;
inline bool operator < (node x)const{
return pos<x.pos;
}
}data[200005];
struct chd{
double pos;
int col,last,to;
inline bool operator < (chd x)const{
return pos<x.pos;
}
}C[200005];
int ccnt;
int cnt;
double n;
int m;
int t1,t2;
inline void mk(int col,int last,int to,double pos){
ccnt++;
C[ccnt].col=col;C[ccnt].last=last;C[ccnt].to=to;C[ccnt].pos=pos;
}
//就是此处见祖宗 注意upd参数的类型!
//请改为long long
inline void upd(int last,int to){
ai-=last;ai2-=last*last;
ai+=to; ai2+=to*to;
}
inline double f(double x){
return (double)n*x*x-(double)2*ai*x+(double)ai2;
}
double ans,anspos;
int main(){
#ifndef ONLINE_JUDGE
freopen("battle.in","r",stdin);
freopen("battle.out","w",stdout);
#endif
cnt=qr(1);m=qr(1);
n=cnt;
RP(t,1,m){
t1=qr(1);
t2=qr(1);
data[t].pos=t1;
data[t].id=t2;
}
sort(data+1,data+m+1);
RP(t,1,m){
p[data[t].id].push_back(data[t].pos);
}
RP(t,1,cnt){
RP(i,1,p[t].size()-1){
mk(t,p[t][i-1],p[t][i],(p[t][i-1]+p[t][i])/2.0);
}
}
sort(C+1,C+ccnt+1);
RP(t,1,cnt){
ai+=p[t][0];
ai2+=p[t][0]*p[t][0];
}
ans=f(ai/n);
anspos=ai/n;
RP(t,1,ccnt){
upd(C[t].last,C[t].to);
register double psj=ai/n,yyb=f(ai/n);
//if(psj>C[t].pos)
//puts("PSJAKIOI");
//puts("yybAKIOI");
if(yyb<ans||(yyb==ans&&psj<anspos)){
anspos=psj;
ans=yyb;
}
}
printf("%.4lf\n",anspos);
return 0;
}
/*
考虑化为代数的形式
ans=\Sigma(a_i-x)^2
ans=nx^2-2\Sigma a_ix+\Sigma a_i^2
二次函数看到没?
考虑用莫队的形式维护\Sigma a_i和\Sigma a_i^2
考虑枚举断点,显然选取的a_i是会变化的,预处理相同颜色的中点即可。
*/
【题解】P3162CQOI2012组装的更多相关文章
- 2015 Multi-University Training Contest 1 题解&&总结
---------- HDU 5288 OO’s Sequence 题意 给定一个数列(长度<$10^5$),求有多少区间[l,r],且区间内有多少数,满足区间内其它数不是他的约数. 数的范围$ ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)
Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...
- [CQOI2012]组装 (贪心)
CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...
- Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题
首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...
- 【BZOJ2666】[cqoi2012]组装 贪心
[BZOJ2666][cqoi2012]组装 Description 数轴上有m个生产车间可以生产零件.一共有n种零件,编号为1~n.第i个车间的坐标为xi,生产第pi种零件(1<=pi< ...
- 建造者模式组装mybatis参数Example()
参考:github, https://github.com/liuxiaochen0625/MyBatis-Spring-Boot-master.git 从controller组装tk.mybat ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
随机推荐
- NOIP2016模拟赛三 Problem B: 神奇的树
题面 Description 有一棵神奇的树.这棵树有N个节点,在每个节点上都有宝藏,每个宝藏价值V[i]金币:对于每条边,每经过一次都要花费C[i]金币. 值得注意的是,每个宝藏只能领取一次(也可以 ...
- fs寄存器相关,PEB,TEB
---恢复内容开始--- FS寄存器指向:偏移 说明000 指向SEH链指针004 线程堆栈顶部008 线程堆栈底部00C SubSystemTib010 FiberData014 Arbitrary ...
- mysql老司机之路
MYSQL数据库基础: 数据库帮我们解决以下数据存取难题: 较大数据量 事务控制 持久化和数据安全 高性能要求 高并发访问 关系型:mysql,oracle,sql server,postgresql ...
- Ubuntu -- 配置Nginx和https及frp
使用 sudo apt -get nginx安装最方便. 要确认80端口未被占用. 上传域名的证书. 然后要配置nginx配置文件.
- 使用virtualenv, uwsgi, nginx来布署django
http://blog.csdn.net/lihao21/article/details/47731903 http://www.cnblogs.com/lxg226/p/3468558.html h ...
- 15.【nuxt起步】-Nuxt使用jsweixin sdk
npm install weixin-js-sdk --save 这个不行,这个是vue前端用的 网上找了一些vue jsweixin的案例 不能直接用 因为nuxt是后端运行,windows对象取不 ...
- 【GLSL教程】(九)其他说明 【转】
http://blog.csdn.net/racehorse/article/details/6664775 法线矩阵 在很多顶点shader中都用到了gl_NormalMatrix.这里将介绍这个矩 ...
- java把一个文件的内容复制到另外一个文件
/** * java把一个文件的内容复制到另外一个文件 */import java.io.File;import java.io.FileInputStream;import java.io.File ...
- Nginx配置文档具体解释
Nginx的配置文档具体解释.在这儿做个总结,以便以后使用的时间查看. 下面大部分自己整理.部分来自參考 #设置用户 #user nobody; #启动进程数(一般和server的CPU同样) #能 ...
- Jackson.jar的使用记录
Jackson.jar的使用记录 之前一直使用json-lib.jar,近期发现网上说这个jackson.jar比較好 package com.spring.controller; import ja ...