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. 集成Spring Data JPA

    1.Spring Data JPA简介 Spring Data是一个用于简化数据访问,并支持云服务的开源框 使用完成Spring Data JPA对user表的CRUD操作. 2.步骤 1.创建工程勾 ...

  2. MindSpore保存与加载模型

    技术背景 近几年在机器学习和传统搜索算法的结合中,逐渐发展出了一种Search To Optimization的思维,旨在通过构造一个特定的机器学习模型,来替代传统算法中的搜索过程,进而加速经典图论等 ...

  3. MySQL分区表最佳实践

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  4. 关于flask的模板注入的学习

    flask模板注入的学习 关于flask模版注入,之前不太理解,看了很多文章才弄懂,主要原理就是渲染函数的参数用户可控就造成了模板注入 就会使用户构造恶意的代码进行逃逸从而进行攻击 flask模板渲染 ...

  5. [Java] Structs

    背景 基于MVC的WEB框架 在表示层过滤访问请求并处理 步骤 在eclipse中创建Web动态项目 导入相关jar包到WEB-INF/lib 在WEB-INF目录下新建web.xml,配置Filte ...

  6. STM32——EEPROM使用——(转载)

    一.I2C接口读写EEPROM(AT24C02) --主模式,分别用作主发送器和主接收器.通过查询事件的方式来确保正常通信. 1.I 2C接口初始化 与其他对GPIO 复用的外设一样,它先调用了用户函 ...

  7. linux中级之keepalived概念

    一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...

  8. 06丨MongoDB基本操作

    使用 insert 完成插入操作 操作格式: db.<集合>.insertOne(<JSON对象>) db.<集合>.insertMany([<JSON 1& ...

  9. 书列荐书 |《刻意练习》安德斯&#183;艾利克森,罗伯特&#183;普尔著

    花了两天的时间,一气呵成的读完了这本书.凝练的精华就是:首先,世界上并没有真正的天才这一说.基因可能会起作用,但是经过后天大量的刻意练习,基因的这种作用会弱化.刻意练习需要专注.及时的反馈,并根据反馈 ...

  10. Java处理Excel中的日期格式

    Java处理Excel中的日期格式 2011-12-23 17:34:03|  分类: java |举报 |字号 订阅 下载LOFTER 我的照片书  |   在Excel中的日期格式,其数值为距离1 ...