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点右面蓝色数量左面蓝色数量就得到了一个 ...
随机推荐
- postman Variables变量的详解与应用
变量 变量类型(按照作用域划分) 全局变量(全局环境里面的变量) 集合变量(请求集合里声明的变量) 自定义环境变量 数据变量(在runner时文件变量) 本地变量 变量权重类型 全局变量 < 集 ...
- 操作系统中的进程同步与Window中利用内核对象进行线程同步的关系
操作系统中为了解决进程间同步问题提出了用信号量机制,信号量可分为四种类型分别是互斥型信号量,记录型信号量,AND型信号量,信号量集. 互斥型信号量 互斥型信号量是资源数量为1的特殊的记录型信号量.表示 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- 缓存架构中的服务详解!SpringBoot中二级缓存服务的实现
创建缓存服务 创建缓存服务接口项目 创建myshop-service-redis-api项目,该项目只负责定义接口 创建项目的pom.xml: <?xml version="1.0&q ...
- TypeScript 中 Optional Chaining 和 Nullish Coalescing
Optional Chaining 解决的问题是重复且无意义的判空,之所以说无意义,是对业务来说它不是必需的,但不判空,程序直接就挂了,比如: let x = foo.bar.baz(); 这里的 ...
- [Java] 数据分析--统计
二项分布 需求:5个四面体筛子,筛子三面绿色,一面红色,模拟1000000次,统计每次试验红色落地筛子个数的分布 实现:用循环实现5个筛子和1000000次试验,定义函数numRedDown模拟5个筛 ...
- 013.Ansible Playbook include
一 include 当项目越大,tasks越多的时候.如果将多有的task写入一个playbook中,可读性很差,就需要重新组织playbook 可以把一个playbook分成若干份晓得palyboo ...
- lsscsi
# lsscsi[2:0:0:0] cd/dvd Slimtype DVD A DS8ACSH LC2M /dev/sr0[3:0:0:0] disk ATA Samsung SSD 860 3B6Q ...
- KVM虚拟化存储管理(4)
一.KVM存储虚拟化介绍 KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的. Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种型: Vol ...
- ioctl 函数的FIOREAD参数
在学习ioctl 时常常跟 read, write 混淆.其实 ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的. 而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲 ...