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. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

  2. DHCP部署与安全

    1.DHCP作用 (Dynamic Host Configure Protocol)自动分配ip地址 2.DHCP相关概念 地址池/作用域:(IP.子网掩码.网关.DNS.租期),DHCP协议端口是U ...

  3. Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则

    最近在Oracle上发现使用hash_hmac()报找不到此函数.为此特意查到oracle的文档.详细请看官网回答:https://cx.rightnow.com/app/answers/detail ...

  4. c语言函数的嵌套使用和矩阵运算

    这段时间,听刚刚学习c的同学说函数嵌套运用不太熟练,想做一个简单的程序进行练习,我也就当练练手了,哈哈.虽然说是比较简单,但是其中的思维也是值得思考的. 一.函数的嵌套使用 简单说明题目:对于等式 y ...

  5. Java基础00-多态19

    1. 多态 多态 1.1 多态概述 代码示例: 动物类: public class Animal { public void eat(){ System.out.println("动物吃东西 ...

  6. 【剑指offer】05. 替换空格

    剑指 Offer 05. 替换空格 知识点:: 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 输入:s = "We are happy.& ...

  7. Requests方法 -- Http协议的短链接与长连接介绍

    转载于简书: 作者:熊师傅链接:https://www.jianshu.com/p/3fc3646fad80 1.以前的误解 很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从 ...

  8. Leetcode:面试题28. 对称的二叉树

    Leetcode:面试题28. 对称的二叉树 Leetcode:面试题28. 对称的二叉树 Talk is cheap . Show me the code . /** * Definition fo ...

  9. swagger是什么(十六)

    前言: swagger:神气十足,大摇大摆 在用Springboot进行开发时,有的实体类上用到了注解@ApiModelProperty("接受人代码"),特此整理此注解的出处及作 ...

  10. jvm源码解读--02 Array<u1>* tags = MetadataFactory::new_writeable_array<u1>(loader_data, length, 0, CHECK_NULL); 函数引入的jvm内存分配解析

    current路径: #0 Array<unsigned char>::operator new (size=8, loader_data=0x7fd4c802e868, length=8 ...