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. python -- 面向对象编程(继承、重写)

    一.继承 子类可以继承父类的所有公有成员,但不能直接访问父类的私有成员,只能通过父类的公有方法间接访问私有属性或私有方法. 如: class DerviedClassName(BaseClassNam ...

  2. c#链接MySql数据库方法

    方法一: 打开visual studio,在项目->管理NuGet程序包->搜索"MySql.Data"并安装: 在程序部分,引入 using MySql.Data.M ...

  3. ecshop二次开发笔记--订单表结构ecs_order_info说明

    -- 表的结构 `ecs_order_info`  CREATE TABLE IF NOT EXISTS `ecs_order_info` (  `order_id` mediumint(8) uns ...

  4. Java数据库分表与多线程查询结果汇总

    今天接到一个需求:要对一个物理分表的逻辑表进行查询统计.而数据库用的是公司自己研发的产品,考虑的到公司产品的特点以及业务的需求,该逻辑表是按年月进行分表的,而非分区.我们来看一下,在按时间段进行查询统 ...

  5. vue(24)网络请求模块axios使用

    什么是axios Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 主要的作用:axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能. a ...

  6. Redis双写一致性与缓存更新策略

    一.双写一致性 双写一致性,也就是说 Redis 和 mysql 数据同步 双写一致性数据同步的方案有: 1.先更新数据库,再更新缓存 这个方案一般不用: 因为当有两个请求AB先后更新数据库后,A应该 ...

  7. 【洛谷P2041 分裂游戏】数学+瞎蒙

    分析 我们推不出n=3的图,开始猜测,答案在n>2时无解.(<-正解) AC代码 #include <bits/stdc++.h> using namespace std; i ...

  8. 【动态规划】合唱队形 luogu-

    分析 做两遍最长上升子序列,在遍历一下,取最大值. AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) m ...

  9. 第4天 JavaDoc生成文档&Java流程控制(第一节:用户交互Scanner)

    JavaDoc生成文档 javadoc命令是用来生成自己的API文档 参数信息: @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @ ...

  10. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【二】

    HarmonyOS内核开发-信号量开发案例学习记录   一.LiteOS里面的任务管理介绍: 任务状态通常分为以下四种: 就绪(Ready):该任务在就绪列表中,只等待CPU. 运行(Running) ...