NOIP模拟测试24「star way to hevaen·lost my music」
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」的更多相关文章
- NOIP模拟测试13「矩阵游戏·跳房子·优美序列」
矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- NOIP模拟测试30「return·one·magic」
magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...
- NOIP模拟测试21「折纸·不等式」
折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...
- NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」
待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...
- NOIP模拟测试10「大佬·辣鸡·模板」
大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...
- NOIP模拟测试4「礼物·通讯·奇袭」
礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考 颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...
- 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」
164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...
- NOIP模拟测试8「寿司」
考试时打的类似$n^2$暴力,然后炸了只有10分 后来验证我的算法伪了. 题解 显然你有一种解法,假设你要在一个B点断开将R分别移向最左 最右,这样只用分别计算B点右面蓝色数量左面蓝色数量就得到了一个 ...
随机推荐
- vuex、localStorage、sessionStorage之间的区别
vuex存储在内存中,localStorage以文件形式存储在本地,sessionStorage针对一个session(阶段)进行数据存储. 当页面刷新时vuex存储的数据会被清除,localStor ...
- opencv——几何变换原理与实现
摘要 图像几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置.几何变换不改变图像的像素值, 只是在图像平面上进行像素的重新安排. 几何变换大致分为仿射变换.投影变换. ...
- Smss.exe加载win32k.sys过程总结
windows操作系统初始化 windows操作系统再初始化的过程中,当内核完全初始化而且各个组件也已经准备好后会加载一个个用户进程smss.exe(会话管理器),此进程会接着调用NtSetSyste ...
- Vue(1):用Vue-cli构建Vue3项目
使用Vue-cli构建Vue3项目 1.检查node版本 node -v 以上node版本位14.15.0满足Vue3项目的创建条件(Vu3需要node 版本8以上) 为什么需要安装node? vue ...
- mysqldump中skip-tz-utc参数介绍
前言: 在前面文章中,有提到过 mysqldump 备份文件中记录的时间戳数据都是以 UTC 时区为基础的,在筛选恢复单库或单表时要注意时区差别.后来再次查看文档,发现 tz-utc.skip-tz- ...
- 关于this的解析:看了就懂,忘记了随时回来看
初识this this => 永远表示某个对象,但写在不同的地方,它表示不同的对象 全局下的this: window => 浏览器环境下的全局对象 console.log(this) =& ...
- 记一次golang内存泄露
记一次golang内存泄露 最近在QA环境上验证功能时,发现机器特别卡,查看系统内存,发现可用(available)内存仅剩200多M,通过对进程耗用内存进行排序,发现有一个名为application ...
- spring为何要注入接口,而注入接口的实现类就会报错
首先说明,注入的对象确实为实现类的对象.(并不是实现类的代理对象,注入并不涉及代理) 如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术 ...
- dpkg -S {file} #ubuntu 14.04 rpm -qf {file} #centos 7
Linux查找命令或组件对应安装包的方法原创FJEagle 最后发布于2017-12-15 19:10:06 阅读数 4603 收藏展开Linux查找命令或组件对应安装包的方法当新搭建服务器或者维护不 ...
- :整数 跳转到该行 Vim中常用的命令
:set nu 显示行号 :set nonu 不显示行号 :命令 执行该命令 :整数 跳转到该行 :s/one/two 将当前光标所在行的第一个one替换成two :s/one/two/g 将当前光标 ...