star way to heaven

题解

大致尝试了一下并查集,记忆化搜索,最小生成树

最小生成树是正解,跑最小生成树然后找到最大的值

欧几里德距离最小生成树学习

prim楞跑

至于为什么跑最小生成树不是跑最大生成树,你跑最大生成树连的边可能会^%$&$%!#

感性理解手膜吧,我理解但说不清楚,稍微手膜就出来了,你可以举出一万种反例

代码实现细节比较多,技巧也比较多

注意边界处理,我们可以以一个边界为0,另一个边界权值为m,比较上下边界时不用再比较横坐标

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010010
double cal(ll x1,ll y1,ll x2,ll y2){
return sqrt((double)((x1-x2)*(x1-x2))+(double)((y1-y2)*(y1-y2)));
}
ll n,m,k;
double ans;
ll x[A],y[A];
double dis[A];
bool vis[A];
int main(){
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=1;i<=k;i++){
scanf("%lld%lld",&x[i],&y[i]);
dis[i]=y[i];
}
dis[k+1]=m;
while(1){
ll mi=0;
for(ll j=1;j<=k+1;j++)
if(!vis[j]&&(mi==0||dis[j]<dis[mi]))
mi=j;
// printf("mi=%lld\n",mi);
ans=max(ans,dis[mi]);
vis[mi]=1;
if(mi==k+1){
printf("%.10lf\n",ans/2);
return 0;
}
for(ll j=1;j<=k;j++)
dis[j]=min(dis[j],cal(x[j],y[j],x[mi],y[mi]));
dis[k+1]=min(dis[k+1],(double)(m-y[mi]));
}
}

代码

lost my music

题解

题目中说的很明显是一个斜率单调栈维护一下

然而这是树上问题,你暴力退栈你会被卡成$n^2$于是我又学习了一下可持久化栈

可持久化栈学习

我用的是二分方法,好理解又好打

大致就是$dfs$时传一个$top$指针,然后你每次找到符合祖先链且斜率最大的地方,每次向下搜时只需要将当前对应位置栈设为$x$然后再回溯

这样我们就可以不用退栈

直接口胡肯定不能理解

| |<---你当前栈顶指向

| |

| |<---符合的位置,你只需要将当前栈指针指向当前,,,,,最后再回溯即可

| |

| |

或者换种方式理解

维护凸包

你若当前可以更新那么赋成当前值斜率更新更大

代码实现

void dfs(ll x,ll pre,ll de,ll top){
deep[x]=de;
ll k=get(x,top)+1,t1=sta[k],t2=sta[k-1];
if(x==1) k=1;
ans[x]=-1.0*(cal(t2,x));
sta[k]=x;
for(ll i=head[x];i;i=nxt[i]){
ll y=ver[i];
if(y==pre) continue;
dfs(y,x,de+1,k);
}
sta[k]=t1;
}

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
ll n,tot;
double ans[A];
ll deep[A],head[A],nxt[A],ver[A],c[A],sta[A];
void add(ll x,ll y){
nxt[++tot]=head[x],head[x]=tot,ver[tot]=y;
}
double cal(ll x,ll y){
return (double)(c[x]-c[y])/(1.0*(double)(deep[x]-deep[y]));
}
ll get(ll x,ll h){
ll l=2,r=h,mid;
double k1,k2;
while(l<=r){
mid=(l+r)>>1;
k1=-1.0*(cal(sta[mid],sta[mid-1]));
k2=-1.0*(cal(x,sta[mid]));
if(k1<k2)r=mid-1;
else l=mid+1;
}
return l-1;
}
void dfs(ll x,ll pre,ll de,ll top){
deep[x]=de;
ll k=get(x,top)+1,t1=sta[k],t2=sta[k-1];
if(x==1) k=1;
ans[x]=-1.0*(cal(t2,x));
sta[k]=x;
for(ll i=head[x];i;i=nxt[i]){
ll y=ver[i];
if(y==pre) continue;
dfs(y,x,de+1,k);
}
sta[k]=t1;
}
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&c[i]);//printf("***\n");
}
for(ll i=2,a;i<=n;i++){
scanf("%lld",&a);
add(a,i);
}
dfs(1,0,1,0);
for(ll i=2;i<=n;i++){
printf("%lf\n",ans[i]);
}
}

NOIP模拟测试24「star way to hevaen·lost my music」的更多相关文章

  1. NOIP模拟测试13「矩阵游戏&#183;跳房子&#183;优美序列」

    矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...

  2. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  3. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  4. NOIP模拟测试21「折纸&#183;不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  5. NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」

    待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...

  6. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  7. NOIP模拟测试4「礼物·通讯·奇袭」

    礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考   颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...

  8. 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」

    164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...

  9. NOIP模拟测试8「寿司」

    考试时打的类似$n^2$暴力,然后炸了只有10分 后来验证我的算法伪了. 题解 显然你有一种解法,假设你要在一个B点断开将R分别移向最左 最右,这样只用分别计算B点右面蓝色数量左面蓝色数量就得到了一个 ...

随机推荐

  1. Ubuntu切换到root账户

    使用命令sudo su或sudo -i然后输入密码就可以切换到root帐号,exit可以退出.

  2. Tomcat&Http协议-授课

    1 企业开发简介 1.1 JavaEE规范 JavaEE规范是J2EE规范的新名称,早期被称为J2EE规范,其全称是Java 2 Platform Enterprise Edition,它是由SUN公 ...

  3. 从零搭建springboot服务03-redis消息订阅

    愿历尽千帆,归来仍是少年 1.所需依赖 <!-- Redis依赖 --> <dependency> <groupId>org.springframework.boo ...

  4. 【转载】linux 安装 中文输入法 Fcitx 手动

    在 Linux(测试版)中安装中文输入法 由于一些原因,目前在 Linux(测试版)中无法调用系统的输入法,故需要安装第三方输入法为 Linux(测试版)中的应用提供中文输入支持.本文档旨在介绍第三方 ...

  5. RHEL sosreport

    RHEL sosreport简介 sosreport对很多RedHat爱好者来说应该并不陌生! 它是一款在RedHat Linux下帮你收集系统信息打成一个tar包的工具,你可以将这个tar包发给供应 ...

  6. 基于Centos 7.4 搭建ELK整合SpringBoot日志收集

    基于Centos 7.4搭建es7.12.0+logstash-7.12.0+kibana-7.12.0(ELK)整合SpringBoot日志收集 注:Skywalking和logstash可共用一个 ...

  7. linux进程间通信-(转自 临水)

    一.进程间通信概述进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别 ...

  8. 5.7 echo:显示一行文本

    echo命令 能将指定的文本显示在Linux命令行上.     -n    不要自动换行 -E    不解析转义字符(默认参数)   -e    若字符串中出现以下字符,则需要进行特别处理,而不会将它 ...

  9. gitlab使用URL导入远程仓库报错

    gitlab使用URL导入远程仓库报错Import url is blocked: Only allowed ports are 80,443, and any over 1024 报错内容为Impo ...

  10. 第14讲 | HTTP协议:看个新闻原来这么麻烦

    第14讲 | HTTP协议:看个新闻原来这么麻烦 http://www.163.com 是个 URL,叫作统一资源定位符. 之所以叫统一,是因为它是有格式的.HTTP 称为协议,www.163.com ...