【题解】[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\)见了三十分祖宗)

  1. #include<bits/stdc++.h>
  2. #define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t)
  3. #define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t)
  4. #define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
  5. #define Max(a,b) ((a)<(b)?(b):(a))
  6. #define Min(a,b) ((a)<(b)?(a):(b))
  7. #define pushup(x) seg[(x)]=seg[(x)<<1]+seg[(x)<<1|1]
  8. #define midd register int mid=(l+r)>>1
  9. #define chek if(R<l||r<L)return
  10. #define TMP template<class ccf>
  11. #define rgt L,R,mid,r,pos<<1|1
  12. #define lef L,R,l,mid,pos<<1
  13. #define all 1,n,1
  14. using namespace std;typedef long long ll;
  15. TMP inline ccf qr(ccf k){
  16. char c=getchar();
  17. ccf x=0;
  18. int q=1;
  19. while(c<48||c>57)q=c==45?-1:q,c=getchar();
  20. while(c>=48&&c<=57)x=x*10+c-48,c=getchar();
  21. return q==-1?-x:x;
  22. }
  23. const int maxn=2e4+15;
  24. ll ai2,ai;
  25. vector < int > p[maxn];
  26. struct node{
  27. int id,pos;
  28. inline bool operator < (node x)const{
  29. return pos<x.pos;
  30. }
  31. }data[200005];
  32. struct chd{
  33. double pos;
  34. int col,last,to;
  35. inline bool operator < (chd x)const{
  36. return pos<x.pos;
  37. }
  38. }C[200005];
  39. int ccnt;
  40. int cnt;
  41. double n;
  42. int m;
  43. int t1,t2;
  44. inline void mk(int col,int last,int to,double pos){
  45. ccnt++;
  46. C[ccnt].col=col;C[ccnt].last=last;C[ccnt].to=to;C[ccnt].pos=pos;
  47. }
  48. //就是此处见祖宗 注意upd参数的类型!
  49. //请改为long long
  50. inline void upd(int last,int to){
  51. ai-=last;ai2-=last*last;
  52. ai+=to; ai2+=to*to;
  53. }
  54. inline double f(double x){
  55. return (double)n*x*x-(double)2*ai*x+(double)ai2;
  56. }
  57. double ans,anspos;
  58. int main(){
  59. #ifndef ONLINE_JUDGE
  60. freopen("battle.in","r",stdin);
  61. freopen("battle.out","w",stdout);
  62. #endif
  63. cnt=qr(1);m=qr(1);
  64. n=cnt;
  65. RP(t,1,m){
  66. t1=qr(1);
  67. t2=qr(1);
  68. data[t].pos=t1;
  69. data[t].id=t2;
  70. }
  71. sort(data+1,data+m+1);
  72. RP(t,1,m){
  73. p[data[t].id].push_back(data[t].pos);
  74. }
  75. RP(t,1,cnt){
  76. RP(i,1,p[t].size()-1){
  77. mk(t,p[t][i-1],p[t][i],(p[t][i-1]+p[t][i])/2.0);
  78. }
  79. }
  80. sort(C+1,C+ccnt+1);
  81. RP(t,1,cnt){
  82. ai+=p[t][0];
  83. ai2+=p[t][0]*p[t][0];
  84. }
  85. ans=f(ai/n);
  86. anspos=ai/n;
  87. RP(t,1,ccnt){
  88. upd(C[t].last,C[t].to);
  89. register double psj=ai/n,yyb=f(ai/n);
  90. //if(psj>C[t].pos)
  91. //puts("PSJAKIOI");
  92. //puts("yybAKIOI");
  93. if(yyb<ans||(yyb==ans&&psj<anspos)){
  94. anspos=psj;
  95. ans=yyb;
  96. }
  97. }
  98. printf("%.4lf\n",anspos);
  99. return 0;
  100. }
  101. /*
  102. 考虑化为代数的形式
  103. ans=\Sigma(a_i-x)^2
  104. ans=nx^2-2\Sigma a_ix+\Sigma a_i^2
  105. 二次函数看到没?
  106. 考虑用莫队的形式维护\Sigma a_i和\Sigma a_i^2
  107. 考虑枚举断点,显然选取的a_i是会变化的,预处理相同颜色的中点即可。
  108. */

【题解】P3162CQOI2012组装的更多相关文章

  1. 2015 Multi-University Training Contest 1 题解&&总结

    ---------- HDU 5288 OO’s Sequence 题意 给定一个数列(长度<$10^5$),求有多少区间[l,r],且区间内有多少数,满足区间内其它数不是他的约数. 数的范围$ ...

  2. “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...

  3. Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

    Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...

  4. [CQOI2012]组装 (贪心)

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

  5. Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题

    首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...

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

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

  7. 建造者模式组装mybatis参数Example()

    参考:github,   https://github.com/liuxiaochen0625/MyBatis-Spring-Boot-master.git 从controller组装tk.mybat ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

随机推荐

  1. ImportError: cannot import name patterns

    The use of patterns is deprecated in Django1.10. Therefore do not import 'patterns' and your url pat ...

  2. DotnetBrowser高级教程-(4)使用MVC框架2-接收与返回模型

    在上一节,我们搭建了基本的mvc框架,这一节,我们将实现数据的接受与返回,具体操作如下: 1.新建Model目录,新增模型类Person.cs,代码如下: public class Person { ...

  3. EasyMvc入门教程-高级控件说明(15)方位布局控件

    现在很多管理后台都流行全屏切割的布局,大体结构如下图所示: 大家注意到没,整个布局是五个部分组成:“东西南北中”,EasyMvc对应的实现的代码为: @(Html.Q().Layout().TextC ...

  4. 窗体皮肤实现 - 增加Toolbar的交互性

    稍微改造一下,让交互性更好点.增加提示和动态效果. 控件实现内容: 1.加入Hint提示 2.加入了简易动画效果,鼠标进入和离开会有个渐变效果. 实现方案: 1.基类选用 2.Action的关联 3. ...

  5. 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 .(转)

    单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...

  6. 3747: [POI2015]Kinoman|线段树

    枚举左区间线段树维护最大值 #include<algorithm> #include<iostream> #include<cstdlib> #include< ...

  7. JAVA使用外部字体将文字生成图片,并使用FontMetrics居中文字

    需求: 1.用户输入文字,根据外部字体,将文字生成图片 2.输出的文字需要居中在图片中显示 遇到的问题: 1.如何导入外部字体?使用Java的Font类,所有的字体都是系统安装过的 2.每次用户输入的 ...

  8. Android 网络编程 记录

    简单介绍 看了深入理解Android网络编程感觉不错.今天对Android网络编程进行了要点记录. 内容 Android基于网络技术和编程实践 要点 定义 描写叙述 IP协议 用于报文交换网络的一种面 ...

  9. HDU 1017 A Mathematical Curiosity (枚举水题)

    Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...

  10. 可软件定义的存储逻辑——Efficient and agile storage management in software defined environments

            note:写这个或许算是翻译,又或算是对这个论文[1]的理解,又或者仅仅是我的看法.         这篇论文和IOFlow相比較,更加注重软件定义存储的框架(利用已有的框架来创建新的 ...