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点右面蓝色数量左面蓝色数量就得到了一个 ...
随机推荐
- JVM垃圾回收的三种方式
* 垃圾回收有三种方式 * 一.清除:将需要回收对象的内存空间存放在内存列表中,当需要为新对象分配内存的时候,就会从内存列表中拿取空间分配.不过这种分配方式有两个缺点 * 第一个缺点是内存空间碎片化, ...
- 手写一个LRU工具类
LRU概述 LRU算法,即最近最少使用算法.其使用场景非常广泛,像我们日常用的手机的后台应用展示,软件的复制粘贴板等. 本文将基于算法思想手写一个具有LRU算法功能的Java工具类. 结构设计 在插入 ...
- Day015 异常处理机制
异常处理机制 抛出异常 捕获异常 异常处理的五个关键字 try:监控一个代码块,有异常就能通过catch捕获 catch(想要捕获的异常类型):捕获想要捕获的异常,catch代码块的代码只有在捕获到异 ...
- [bug] xshell:退格键乱码
参考 https://jingyan.baidu.com/article/77b8dc7fd52c576174eab6f6.html
- 【转载】linux-查询rpm包相关安装、卸载脚本
测试过程中,有时要测试开发自己打的rpm包,为了确认打包正确,需要查询rpm包相关安装.卸载脚本,可以使用命令: [root@6 /]#rpm -q --scripts mysql pos ...
- iowait 的常见误解
转自:理解 %IOWAIT (%WIO):http://linuxperf.com/?p=33 %iowait 是 "sar -u" 等工具检查CPU使用率时显示的一个指标,在 ...
- MyBatis 环境搭建(四)
MyBatis 引言 在回顾JDBC时,我们已经创建有 Java 工程,而且也已经导入 mysql 依赖包,这里就直接在原有工程上搭建MyBatis环境,以及使用MyBatis来实现之前用 JDBC ...
- 一文带你搞懂 RPC 到底是个啥
RPC(Remote Procedure Call),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议.我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点, ...
- unity ab包打包和加载的简单学习示例
闲着没事结合项目看了下unity AssetBundle打包和使用,写了一些测试例子,需要的可以拿去,导入一个空项目即可 链接:https://pan.baidu.com/s/1H85dnMNkRoW ...
- week-01
week-01 1. 计算机组成 从底层开始: 硬件: CPU.内存.硬盘.网卡.主板.显卡.风扇.电源.鼠标键盘 等: 系统: Linux.Windows.Mac 等: 软件: QQ.微信.吃鸡.农 ...