[tc13008]Egalitarianism2
考虑对于$n-1$个数$a_{i}$,函数$f(x)=\frac{\sum_{i=1}^{n-1}(x-a_{i})^{2}}{n-1}$的最小值恰在$x=\frac{\sum_{i=1}^{n-1}a_{i}}{n-1}$取到(根据二次函数显然),因此题意可以理解为任选实数$b$并最小化$\frac{\sum_{i=1}^{n-1}(b-a_{i})^{2}}{n-1}$(本来要求$b$为平均值)
可以暴力枚举$b$并将边权从$d$变为$(b-d)^{2}$求最小生成树,但由于$b$为实数,并不能直接枚举
(为了方便,以下约定两条边边权若相同,编号小的更小)
对于最小生成树而言,所选的边事实上仅取决于边的大小关系,考虑两条边$i$和$j$(其中$i<j$)满足$i$在$j$前面当且仅当$X\le \lfloor\frac{w_{i}+w_{j}}{2}\rfloor$,以此法即产生了$o(n^{4})$个区间,每一个区间内大小关系都相同
(每一段都是左端点为圆括号,右端点为中括号)
对于每一段,以$b$作为参数来表示边权,比较时使用区间内任意数字即可,最后即求一个二次函数区间(其实也可以忽略区间限制)最小值,即可做到$o(n^{6})$的复杂度,可以通过
(以下可能有一些口胡)
更进一步的,考虑每一次权值变化即将两条边优先级交换,且交换的两边优先级相邻(不妨假设为两边为$i$和$j$,其中交换前$i$优先级较大),此时不难证明——
如果修改最小生成树,则必然是$i$本来在最小生成树中被删除,$j$本来不在最小生成树中被加入(其余边不修改)
(证明考虑kruskal贪心的过程并分类讨论即可)
因此只需要判定能否替换即可,用按秩合并并查集维护,复杂度为$o(n^{4}\log n)$


- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 #define N 25
- 4 #define sqr(k) (k)*(k)
- 5 struct fun{
- 6 double a,b,c,val;
- 7 fun(){
- 8 a=b=c=val=0;
- 9 }
- 10 fun(double aa,double bb,double cc,double vall){
- 11 a=aa,b=bb,c=cc,val=vall;
- 12 }
- 13 bool operator < (const fun &k)const{
- 14 return val<k.val;
- 15 }
- 16 fun operator + (const fun &k)const{
- 17 return fun(a+k.a,b+k.b,c+k.c,0);
- 18 }
- 19 double mn(){
- 20 return c-sqr(b)/(4*a);
- 21 }
- 22 }D[N],w[N][N];
- 23 vector<double>v;
- 24 int n,vis[N];
- 25 double ans,d[N][N];
- 26 fun calc(){
- 27 fun ans;
- 28 D[0]=fun();
- 29 for(int i=1;i<n;i++)D[i]=fun(0,0,0,1e15);
- 30 memset(vis,0,sizeof(vis));
- 31 for(int i=0;i<n;i++){
- 32 int k=-1;
- 33 for(int j=0;j<n;j++)
- 34 if ((!vis[j])&&((k<0)||(D[j]<D[k])))k=j;
- 35 vis[k]=1;
- 36 ans=ans+D[k];
- 37 for(int j=0;j<n;j++)D[j]=min(D[j],w[k][j]);
- 38 }
- 39 return ans;
- 40 }
- 41 class Egalitarianism2{
- 42 public:
- 43 double minStdev(vector<int>x,vector<int>y){
- 44 n=x.size();
- 45 for(int i=0;i<n;i++)
- 46 for(int j=0;j<n;j++)d[i][j]=sqrt(1LL*sqr(x[i]-x[j])+1LL*sqr(y[i]-y[j]));
- 47 for(int i=0;i<n;i++)
- 48 for(int j=i+1;j<n;j++)
- 49 for(int ii=i;ii<n;ii++)
- 50 for(int jj=ii+1;jj<n;jj++)
- 51 if ((i<ii)||(j<jj))v.push_back((d[i][j]+d[ii][jj])/2);
- 52 sort(v.begin(),v.end());
- 53 double lst=0;
- 54 ans=1e15;
- 55 for(int i=0;i<v.size();i++)
- 56 if ((!i)||(v[i]!=v[i-1])){
- 57 for(int j=0;j<n;j++)
- 58 for(int k=0;k<n;k++)w[j][k]=fun(1,-2*d[j][k],sqr(d[j][k]),sqr(v[i]-d[j][k]));
- 59 ans=min(ans,calc().mn()/(n-1));
- 60 lst=v[i];
- 61 }
- 62 return sqrt(ans);
- 63 }
- 64 };
[tc13008]Egalitarianism2的更多相关文章
随机推荐
- caffe运行错误 target_blobs.blobs_size()与 source_layer.blobs_size() 不一致
解决方法参考:http://blog.csdn.net/zhangla1220/article/details/50697352 感谢博主!!! 最新下载的caffe代码,运行mnist,训练时可以正 ...
- golang []byte和string的高性能转换
golang []byte和string的高性能转换 在fasthttp的最佳实践中有这么一句话: Avoid conversion between []byte and string, since ...
- Redis 深入
1.缓存更新 一般来说缓存的更新有两种情况: 先删除缓存,再更新数据库. 先更新数据库,再删除缓存. 这两种情况在业界,大家对其都有自己的看法.具体怎么使用还得看各自的取舍.当然肯定会有人问为什么要删 ...
- 自动化运维利器Ansible要点汇总
由于大部分互联网公司服务器环境复杂,线上线下环境.测试正式环境.分区环境.客户项目环境等造成每个应用都要重新部署,而且服务器数量少则几十台,多则千台,若手工一台台部署效率低下,且容易出错,不利后期运维 ...
- .Net Core中使用ElasticSearch(一)
一.安装配置 在官网下载Es,注意版本号,不同大版本号之间差异很大.我安装的是7.14.0版本 1.1 安装成服务 cmd 进入bin目录下执行 elasticsearch-service.bat i ...
- QG-2019-AAAI-Improving Neural Question Generation using Answer Separation
Improving Neural Question Generation using Answer Separation 本篇是2019年发表在AAAI上的一篇文章.该文章在基础的seq2seq模型的 ...
- Sequence Model-week3编程题2-Trigger Word Detection
1. Trigger Word Detection 我们的触发词将是 "Activate.".每当它听到你说 "Activate.",它就会发出 "c ...
- logging模块二
背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...
- Spring Cloud Alibaba整合Sentinel
Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...
- FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2
既然我们已经有了所有的安全流程,就让我们来使用 JWT 令牌和安全哈希密码让应用程序真正地安全. 关于 JWT 它是一个将 JSON 对象编码为密集且没有空格的长字符串的标准.字符串看起来像这样: e ...