T1

是我早就忘干净的最小生成树...(特殊生成树,欧几里得生成树)

用一手prim算法一直连最小距离边

连到\(k+1\)(边界)退出即可。

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef double db;//(double)clock() / (double)CLOCKS_PER_SEC;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline db min(db a,db b){return a<b?a:b;}inline db max(db a,db b){return a>b?a:b;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
const int N=6050;
int n,m,k,x[N],y[N],v[N];db ans,dis[N];
inline db len(int x,int y,int a,int b){
return sqrt(1ll*(a-x)*(a-x)+1ll*(b-y)*(b-y));
}
inline short main(){
n=read(),m=read(),k=read();
F(i,1,k){
x[i]=read(),y[i]=read();
dis[i]=y[i];
}dis[k+1]=m;
while(1){
int mi=0;
F(i,1,k+1)
if(!v[i]&&(!mi||dis[i]<dis[mi]))
mi=i;
ans=max(ans,dis[mi]);
if(mi==k+1){
pf("%.10lf",ans/2);
return 0;
}
F(i,1,k)dis[i]=min(dis[i],len(x[i],y[i],x[mi],y[mi]));
dis[k+1]=min(dis[k+1],m-y[mi]);v[mi]=1;
}
return 0;
}
}
signed main(){return EMT::main();}

T2

用一手神仙线段树...

\(f\),\(mf\),\(mx\)分别代表最小权值,左子树在右子树限制下的最小权值,最大的限制\(i\),

从\(1\)到\(n\)依次插入即可。

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef long long ll;//(double)clock() / (double)CLOCKS_PER_SEC;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline int min(int a,int b){return a<b?a:b;}inline int max(int a,int b){return a>b?a:b;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
const int N=2e5+100,inf=2e9;
int n,p[N],c[N],rmax,an=2e9,f[N];
struct tree{int mx,f,mf;}t[N<<2];
inline int query(int p,int l,int r,int ql,int qr,int v){
if(t[p].mx<v)return inf;
if(l==r){rmax=max(rmax,t[p].mx);return t[p].f;}
int mid=(l+r)>>1;
if(l==ql&&r==qr){
if(t[p<<1|1].mx<v)return query(p<<1,l,mid,ql,mid,v);
rmax=max(rmax,t[p].mx);
return min(t[p].mf,query(p<<1|1,mid+1,r,mid+1,qr,v));
}
if(qr<=mid)return query(p<<1,l,mid,ql,qr,v);
if(ql>mid)return query(p<<1|1,mid+1,r,ql,qr,v);
rmax=0;
int tmp=query(p<<1|1,mid+1,r,mid+1,qr,v);
return min(tmp,query(p<<1,l,mid,l,mid,rmax));
}
inline void insert(int p,int l,int r,int x,int v){
if(l==r){
t[p].f=f[v];t[p].mx=v;
return;
}int mid=(l+r)>>1;
if(x<=mid)insert(p<<1,l,mid,x,v);
else insert(p<<1|1,mid+1,r,x,v);
t[p].mf=query(p<<1,l,mid,l,mid,t[p<<1|1].mx);
t[p].f=min(t[p<<1].f,t[p<<1|1].f);
t[p].mx=max(t[p<<1].mx,t[p<<1|1].mx);
}
inline short main(){
n=read();
F(i,1,n)p[i]=read();
F(i,1,n)c[i]=read();
F(i,1,n*4)t[i].f=t[i].mf=inf;
for(register int i=1;i<=n*4;i<<=1)t[i].f=t[i].mf=0;
F(i,1,n){
f[i]=query(1,0,n,0,p[i]-1,0)+c[i];
insert(1,0,n,p[i],i);
}
int T=0;
D(i,n,1)if(p[i]>T)T=p[i],an=min(an,f[i]);
pi(an);
return 0;
}
}
signed main(){return EMT::main();}

T3

倍增维护单调栈...(说是单调栈,其实栈数组都不用开

\(f_{i,j}\)表示在栈内i的j级父亲,不断弹栈、维护即可。

Code

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
namespace EMT{
#define pf printf
#define F(i,a,b) for(register int i=a;i<=b;i++)
#define D(i,a,b) for(register int i=a;i>=b;i--)
typedef double db;//(double)clock() / (double)CLOCKS_PER_SEC;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline db min(db a,db b){return a<b?a:b;}inline db max(db a,db b){return a>b?a:b;}
inline void pi(int x){pf("%d ",x);}inline void pn(){pf("\n");}
inline void file(){freopen("in.in","r",stdin);freopen("my.out","w",stdout);}
const int N=5e5+100;
int deep[N],n,head[N],co,c[N],fa[N][22];db ans[N];
struct node{int next,to;}e[N<<1];
inline void add(int next,int to){e[++co].next=head[next],e[co].to=to,head[next]=co;}
inline bool lop(int x,int y,int t){return (db)(c[x]-c[t])/(db)(deep[t]-deep[x])<(db)(c[y]-c[t])/(db)(deep[t]-deep[y]);}
inline void dfs(int k,int f){
deep[k]=deep[f]+1;
D(i,20,0){
if(fa[f][i]<=1)continue;
int t=fa[f][i];
if(lop(fa[t][0],t,k))f=t;
}
if(f>1){
if(lop(fa[f][0],f,k))f=fa[f][0];
}fa[k][0]=f;
ans[k]=(db)(c[fa[k][0]]-c[k])/(db)(deep[k]-deep[fa[k][0]]);
F(i,1,20)fa[k][i]=fa[fa[k][i-1]][i-1];
for(register int i=head[k],j;i;i=e[i].next)j=e[i].to,dfs(j,k);
}
inline short main(){
n=read();
F(i,1,n)c[i]=read();
F(i,2,n){int x=read();add(x,i);}
dfs(1,0);
F(i,2,n)pf("%.10lf",ans[i]),pn();
return 0;
}
}
signed main(){return EMT::main();}

noip模拟16的更多相关文章

  1. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  2. 7.15考试总结(NOIP模拟16)[Star Way To Heaven·God Knows·Lost My Music]

    败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理 ...

  3. NOIP模拟16:「Star Way To Heaven·God Knows·Loost My Music」

    T1:Star Way To Heaven 基本思路:   最小生成树.   假如我们将上边界与下边界看作一个点,然后从上边界经过星星向下边界连边,会发现,他会形成一条线将整个矩形分为左右两个部分. ...

  4. Noip模拟16 2021.7.15

    题目真是越来越变态了 T1 Star Way To Heaven 首先,你要看出这是一个最小生成树的题(妙吧?) 为什么可以呢? 我们发现从两点连线的中点过是最优的,但是上下边界怎么办呢? 我们把上下 ...

  5. NOIP模拟 16

    嗯我已经是个不折不扣的大辣鸡了 上次的T3就弃了,这次又弃 颓废到天际 T1 巨贪贪心算法 我就是一个只会背板子的大辣鸡 全裸的贪心看不出来,只会打板子 打板子,加特判,然后一无进展,原题不会,这就是 ...

  6. [NOIP模拟16]题解

    A.Blue 出题人大概已经去为国家处理积压子弹了? 贪心,让每一只青蛙(我怂行吧)都尽量往远跳,能到达的最远的被踩了就跳次远的,以此类推.可以维护一个单调队列,表示每只青蛙的位置(开始都是0).然后 ...

  7. [考试总结]noip模拟16

    达成成就,一天更3篇总结. 又是一个暴力场 别问我为什么开局 \(5\) 分钟就问老师为什么 \(T3\) 没有提交的窗口. 开题读题,一路自闭到 \(T3\) ,发现 \(T3\) 可打暴力,所以一 ...

  8. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...

  9. NOIP 模拟 $16\; \rm God Knows$

    题解 \(by\;zj\varphi\) 对于这道题,不难想到可以用 \(dp\),就是求一个最小权极长上升子序列 设 \(dp_i\) 表示最后一个选 \(i\) 时,覆盖前 \(i\) 条边的最小 ...

  10. NOIP 模拟 $16\; \rm Star Way To Heaven$

    题解 \(by\;zj\varphi\) 看懂题!!! 从最左穿到最右,一定会经过两个星星之间或星星和边界之间,那么我们穿过时当前最优一定是走中点 而我们要求最小的距离最大,那么我们将所有星星和边界( ...

随机推荐

  1. Kotlin Coroutine(协程): 三、了解协程

    @ 目录 前言 一.协程上下文 1.调度器 2.给协程起名 3.局部变量 二.启动模式 CoroutineStart 三.异常处理 1.异常测试 2.CoroutineExceptionHandler ...

  2. 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建

    Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ...

  3. 让我手把手教你写一个强大、方便使用的 IOC 容器

    一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...

  4. C语言:变量

    变量: 1.在程序运行过程中,值可以改变的量称为变量 2.每个变量都有一个名字,称为变量名 3.每个变量都必须进行变量说明,指明变量的类型 4.每个变量都有一个对应的地址,写法:&变量名 5. ...

  5. C语言入门思路

    C语言编程入门 0.数学中的常数在编程语言中称为常量,是一直不变的.如1,2,'a',"abc",3456,34.56等1.变量:类似于数学中的未知数.实际上就是指可用内存的一块区 ...

  6. glibc库和glib库

    http://ftp.acc.umu.se/pub/GNOME/sources/ ubuntu16上glib的安装包的名是libglibXX  XX是版本号 ubuntu上查看glibc的方法 ldd ...

  7. Halcon——图像增强算子以及分类

    摘要 图像增强就是指通过某种图像处理方法对退化的某些图像特征,如边缘.轮廓.对比度等进行处理,以改善图像的视觉效果,提高图像的清晰度,或是突出图像中的某些"有用",压缩其他&quo ...

  8. CSS设置height为100%无效的情况

    CSS设置height为100%无效的情况 笔者是小白,不是特别懂前端.今天写一个静态的HTML页面,然后想要一个div占据页面的100%,但是尝试了很多办法都没有实现,不知道什么原因. 后来取百度搜 ...

  9. yaml 文件解析

    前言 yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时都会原样输出,yam ...

  10. SSM框架中mapper层,增删改查,如何实现

    1.批量修改 <!-- 批量修改 MySQL--> <update id="updateBatch" parameterType="java.lang. ...