写这篇题解是因为作者太蒻已经忘了最小生成树了。

<题面>

这个题还真是想不到最小生成树。

$80\%$算法

复杂度:$\Theta(k^2 \log N )$

用了二分答案(明显答案具有单调性)

然后$k^2$暴力判断是否合法。

可以得到80分。

$100\%$算法

复杂度:$\Theta(k^2)$

考虑上面的暴力判断,

如何判断呢?要搜点距,$dfs$

然后我们就可以得到一些东西。

假设现在得到了答案是$ans$

我们考虑它的特性。

在每一个点上以$ans$为半径画圆

那么,一定有一条边上的两条圆是相切的。

如果$ans$变小,那么一定有一个更优解。

如果$ans$更大,那么圆一定会相交导致路径不连续。

我们再找找性质,

发现这两个圆一定在上边界到下边界的路径上,且是路径上最长的边,这也是导致上文路径不连续的原因。

对于一个点,那个圆一定出现在与它相连的最短边上,

因为如果有更长边,更长边会充当一个三角形的最长边,导致路径会受更短的一条边约束。

于是有最小生成树(我考试肯定想不出来QAQ)

在找最小生成树时,就一定可以保证找到加入树的边一定是上文的最短边。

于是直接套用$Prim$顺便维护到下边界的距离,复杂度$\Theta(k^2)$

我本来想优化,于是想用堆:$\Theta(k^2) \Rightarrow \Theta(e \log k)$

于是边数$e=k^2$

$\Theta(k^2) \Rightarrow \Theta(k^2 \log k)$//当我没说

这时有一个问题,不能建图,空间复杂度不可承受。

于是需要使用欧几里得距离最小生成树。

你可能肯定会想,这又是什么玩意?

其实就是最小生成树,只是不建边而是去用点直接计算距离。

所以愉快的AC了

#include <iostream>
#include <cstdio>
#include <cmath>
#define N 6060
#define LF double using namespace std; int pn,hei;
struct x_y{
LF x,y;
}ps[5*N];
LF dis[5*N],ans=0;
bool is_v[N];
inline LF len(const x_y a,const x_y b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void prim(){
for(int i=1;i<=pn;i++){
dis[i]=hei-ps[i].y;
}
for(int i=1;i<=pn+1;i++){
int x=0;
for(int j=1;j<=pn+1;j++){
if((!is_v[j])&&(x==0||dis[j]<dis[x])){
x=j;
}
}
ans=max(ans,dis[x]);
if(x==pn+1){//这里是必写的,因为这个意味着更新结束
return ;
}
is_v[x]=1;
int j;
for(j=1;j<=pn;j++){
{
dis[j]=min(dis[j],len(ps[j],ps[x]));
}
}
dis[pn+1]=min(dis[pn+1],ps[x].y);
}
}
int main(){
int x,y;
scanf("%*d%d%d",&hei,&pn);
for(int i=1;i<=pn;i++){
scanf("%d%d",&x,&y);
ps[i].x=x;
ps[i].y=y;
}
dis[pn+1]=hei;
prim();
printf("%.9lf",ans/2);
}

码量也并不大。

这里顺便写一下两个最小生成树的板板。

1.Kruskal

/*****
Kruskal
*****/
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
bool b[101];
int answer,ans,n,t,f[1001];
struct node
{
int fr,to,ti;
}a[10001];
bool cmp(node xx,node yy)
{
return xx.ti<yy.ti;
}
int find(int x)
{
if (f[x]==x) return x;
else return f[x]=find(f[x]);
}
void merge(int x,int y)
{
int xx=find(x);
int yy=find(y);
if (xx<yy) f[xx]=f[yy];
else f[yy]=f[xx];
}
int main()
{
scanf("%d",&n);
for (int i=1; i<=n; ++i) f[i]=i;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
{
int x;
scanf("%d",&x);
if (x!=0) {a[++t]=(node){i,j,x};}
}
int k=0;
sort(a+1,a+t+1,cmp);
for (int i=1; i<=t; ++i)
{
if (find(a[i].fr)!=find(a[i].to)) {//不在同一个集合中
merge(a[i].fr,a[i].to);//合并
ans+=a[i].ti;//记录最小生成值
k++;//记录边数
}
if (k==n-1) break;//一棵树,n个点,n-1条边
}
printf("%d",ans);
}

2.Prim

/******
Prime
******/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int con[101][101],dis[101],num,a;
int main(){
cin>>num;
long long sum=0,min=0x7fffffff;
memset(dis,0x7f,sizeof(dis));
for(int i=1;i<=num;i++){
for(int j=1;j<=num;j++){
scanf("%d",&con[i][j]);
}
}
dis[1]=0;
for(int i=1;i<=num;i++)
dis[i]=con[1][i];
for(int i=1;i<=num;i++){
min=0x7f7f7f7f;
for(int j=1;j<=num;j++){
if(dis[j]!=0&&dis[j]<min){
min=dis[j];//cout<<"i"<<i<<"min"<<min<<endl;
a=j;//cout<<"a"<<a<<endl;
}
}
sum+=dis[a];
dis[a]=0;
for(int j=1;j<=num;j++)
if(dis[j]>con[a][j])
dis[j]=con[a][j];
}
printf("%d\n",sum);
return 0;
}

20190817-T1-LOJ6322「雅礼国庆 2017 Day6」Star Way To Heaven的更多相关文章

  1. 【loj6307】「雅礼国庆 2017 Day1」Clique 贪心

    题目描述 数轴上有 $n$ 个点,第 $i$ 个点的坐标为 $x_i$ 权值为 $w_i$ .两个点 $i,j$ 之间存在一条边当且仅当 $|x_i−x_j|\le w_i+w_j$ . 你需要求出这 ...

  2. Loj #6307. 「雅礼国庆 2017 Day1」Clique

    link: https://loj.ac/problem/6307 最大团转补图的独立集,这样的话只有r[x]<l[y]或者r[y]<l[x],x和y才能连边,所以排序之后乱搞就行了. 需 ...

  3. 【loj6034】「雅礼集训 2017 Day2」线段游戏

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...

  4. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  5. 「雅礼集训 2017 Day7」事情的相似度

    「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...

  6. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  7. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  8. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  9. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

随机推荐

  1. Python全栈开发:Ajax全套

    概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...

  2. pg总览

    一.编译安装初始化等 ./configure --prefix=/release --with-openssl --without-ldap --with-libxml - -enable-threa ...

  3. 用shell编写小九九乘法表程序

    1.使用for循环 运行结果: 2.方法二:for循环 运行结果: 备注: 1. echo -n 的意思是不自动换行,因为在linux shell中 echo到最后一个字符时会自动换行的,所以echo ...

  4. 【JZOJ3337】wyl8899的TLE

    description wyl8899今天也很刻苦的在做老师布置下来的题目! 这一天老师布置的题目是这样的: 给出两个仅含小写字母的字符串A和B,输出最大的k,使得A[1..k]是B的子串. A和B的 ...

  5. 安装Ubuntu16.04卡在logo界面

    问题背景 笔者在使用U盘UEFI模式安装Ubuntu16.04时,遇到一个问题,即在BIOS里的boot设置U盘为第一启动项之后,启动,并没有顺利进入系统,而是卡在了logo界面.(PS:其实我等了它 ...

  6. H5在部分苹果手机IOS系统下重力感应无效

    原因不明,反正在IOS系统12.2以上的普通的H5移动端网页的重力感应功能无反应 解决方法: 把链接改为HTTPS,经过测试,12.2系统以上的如果你的链接是HTTP的,重力感应在网页上是没调起的,改 ...

  7. centos7 搭建 php7 + nginx (1)

    前言 曾今,写过几篇类似的文章,但是发现几个月后,自己回头再看的时候,有种支离破碎的感觉.自己写的并不全,所以今天打算写一篇比较详细的文档.争取下次环境的减的时候,只需要拷贝复制粘贴即可完成环境搭建. ...

  8. QQ邮箱发送信息

    #以下库为python自带的库,不需要进行安装 #邮件发信动作 import smtplib #构造邮件内容 from email.mime.text import MIMEText #构造邮件头 f ...

  9. webpack新手名词解释……妈妈再也不担心我看不懂webpack官方文档了

    __dirname : 在任何模块文件内部,可以使用__dirname变量获取当前模块文件所在目录的完整绝对路径. path.resolve(): 方法将一系列路径或路径段解析为绝对路径. 语法: p ...

  10. [POI2014]KAR-Cards

    题目链接: 传送门 题目分析: 线段树妙题,感觉思路奇奇怪怪的,虽然对我来说不是"线段树菜题"(\(ldx\)神仙\(blog\)原话)\(QAQ\) 考虑怎么样维护可合并的信息解 ...