考场时Prim的 $i$ 写成 $k$ 100->0 rank1->rank23


T1 Star Way To Heaven

考场正解:假设你要二分答案,则几个圆组成几道“屏障”把画面切成几部分,走每一个屏障的最长边的中点,这样是最优的。

但是屏障间的点可能对答案有影响,所以要把它们合成为一道屏障。

首先取上或下边界,如集合,之后每次取离集合最近的点加入集合,这样就可以找到“屏障”合成后的样子,因为:

对于这样子的三个点,$d(1,2),d(2,3)<=d(1,3)$,所以对于题目而言,只使用 $d(1,2),d(2,3)$ 的距离就可以成功限制好对答案的影响。

在求出的点集中的边取最大值的一半即为答案。

#include<bits/stdc++.h>
using namespace std;
const int N=1100000,K=6100;
const long double INF=0x7fffffff;
inline int read()
{
int s=0,w=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
int n,m,k;
bool vis[K];
long double x[K],y[K],ans,dis[K];
long double X(int q)
{
return x[q];
}
long double Y(int q)
{
return y[q];
}
long double D(int a,int b)
{
return sqrt((X(a)-X(b))*(X(a)-X(b))+(Y(a)-Y(b))*(Y(a)-Y(b)));
}
int main()
{
n=read();m=read();k=read();
for(int i=1;i<=k;i++)
{
scanf("%Lf%Lf",&x[i],&y[i]);
}
for(int i=1;i<=k;i++)
{
dis[i]=1.0*y[i];
}
dis[k+1]=m;
for(int i=1;i<=k+1;i++)
{
long double minn=INF;
int x=-1;
for(int j=1;j<=k+1;j++)
{
if(vis[j])
continue;
if(dis[j]<minn)
{
minn=dis[j];
x=j;
}
}
vis[x]=1;
ans=max(dis[x],ans);
if(x==k+1)
{
printf("%.8Lf\n",ans*0.5);
return 0;
}
for(int j=1;j<=k;j++)
{
if(!vis[j])
{
dis[j]=min(dis[j],max(dis[x],D(x,j)));
}
}
dis[k+1]=min(dis[k+1],m-y[x]);
}
// printf("%.8Lf\n",ans/2.0);
return 0;
}
/*
10 5 2
1 1
2 3
*/

T2 God Knows

玄学DP,考场想50mins没想出 $n^2$ DP,写了一个只能过样例的假DP竟然有10分...

我对这个DP理解并不深,这篇博客更好。

\begin{align}
f[i]=\min f[j]+c[i] (j < i\And p[j] < p[i] \And \forall j< k < i , p[k] < p[j] || p[k] > p[i] )
\end{align}

f[i]表示前i个点已经被解决。

对这个式子的解释是:f[i]如果要从f[j]转移,则必须要保证 \([j+1,i]\) 内的点都与线 \(j\) 或线 \(i\) 相交,同时线 \(j\) 不能与线 \(i\) 相交。

对这个式子分析可以发现,从 \(1\) 到 \(n\) 的一个合法的转移序列中, \(p[i]\) 是递减的。即 \(p[i]\) 在 \(i\) 上递减。

或者说, \(i\) 在 \(p[i]\) 上递减。

那么可以以 \(p\) 维护一棵线段树,可以 \(O(\log(n))\) 查出合法最佳转移。

#include<bits/stdc++.h>
using namespace std;
const int N=210000,INF=0x7fffffff;
int nxt,n,p[N],w[N];
struct xds
{
int l,r,mn,mx,upmn;
}t[N*4];
void build(int p,int l,int r){
t[p].l=l; t[p].r=r;
t[p].mn=t[p].upmn=INF;
t[p].mx=-1;
if(l==r) return ;
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
int calc(int p,int nxt)
{
if(t[p].l==t[p].r)
return t[p].mx>nxt?t[p].mn:INF;
if(t[p*2+1].mx>nxt)
return min(t[p*2].upmn,calc(p*2+1,nxt));
return calc(p*2,nxt);
}
int query(int p,int l,int r)
{
int res=INF;
if(t[p].l>=l&&t[p].r<=r)
{
res=calc(p,nxt);
nxt=max(t[p].mx,nxt);
return res;
}
if(r>=t[p*2+1].l)
res=min(query(p*2+1,l,r),res);
if(l<=t[p*2].r)
res=min(query(p*2,l,r),res);
return res;
}
void insert(int p,int pos,int tail,int val){
if(t[p].l==t[p].r){
t[p].mn=val;
t[p].mx=tail;
return ;
}
if(pos<=t[p*2].r) insert(p*2,pos,tail,val);
else insert(p*2+1,pos,tail,val);
t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
t[p].mn=min(t[p*2+1].mn,t[p*2].upmn=calc(p*2,t[p*2+1].mx));
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
n++;
p[n]=n;
build(1,0,n+1);
insert(1,0,0,0);
for(int i=1,ans;i<=n;i++)
{
nxt=-1;
ans=query(1,0,p[i]-1)+w[i];
insert(1,p[i],i,ans);
if(i==n)
printf("%d\n",ans);
}
return 0;
}

T3 Lost My Music



这题首测卡题面没说的精度,大家纷纷炸成10分。

考场暴力50分。

作如下变形:

\(\frac{c_v-c_u}{dis(u,v)}=-\frac{c_u-c_v}{dep_u-dep_v}\)

如果把 \(c\) 看成横坐标,\(dep\)看成纵坐标,题目变成了一个实时维护斜率最大值的题。

维护一个下凸包,树上 \(dfs\),用单调栈维护凸包,每到达一个点,二分出该点在凸包上的插入位置,这时栈顶斜率即为该点答案。

回溯时把凸包改回原来的样子。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1100000;
long double ans[N];
int dep[N],head[N],cnt,zhan[N];
int n;
ll c[N];
struct bian
{
int nxt,to;
}b[N];
void add(int u,int v)
{
b[++cnt].to=v;
b[cnt].nxt=head[u];
head[u]=cnt;
}
long double K(int x,int y)
{
return (long double)(c[x]-c[y])/(long double)(dep[x]-dep[y]);
}
int get(int u,int r)
{
int l=2,mid;
long double k1,k2;
while(l<=r)
{
mid=(l+r)>>1;
k1=(long double)(-1)*K(zhan[mid],zhan[mid-1]);
k2=(long double)(-1)*K(zhan[mid],u);
if(k1<k2)
r=mid-1;
else
l=mid+1;
}
return l-1;
}
void dfs(int u,int fa,int top)
{
int k=get(u,top)+1,tmp1=zhan[k],tmp2=zhan[k-1];
if(u==1)
k=1;
ans[u]=(long double)(-1)*K(tmp2,u);
zhan[k]=u;
for(int i=head[u],v;i;i=b[i].nxt)
{
v=b[i].to;
if(v==fa)
continue;
dep[v]=dep[u]+1;
dfs(v,u,k);
}
zhan[k]=tmp1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&c[i]);
}
for(int i=2,a;i<=n;i++)
{
scanf("%d",&a);
add(a,i);
}
dep[1]=1;
dfs(1,0,0);
for(int i=2;i<=n;i++)
{
printf("%.10Lf\n",ans[i]);
}
return 0;
}
/*
8
31516 11930 18726 12481 79550 63015 64275 7608
1 1 2 4 2 4 5
*/

这次考试用脚出题……

下发文件上写着第一题没有SPJ,第二题有,实际相反。

T1题面说输出一行整数……害了多少人以为是走整数点路径。

T3卡精度后来又重测

T3数据说的 \(500\) 内数据也残缺

上一次考试T1还出了超出100%数据范围的数据,巨佬cyh搞了1h才发现。

20210716考试-NOIP16的更多相关文章

  1. 20210716考试-NOIP19

    u,v,w. 这场考过. T1 u 差分裸题 #include<bits/stdc++.h> using namespace std; const int N=5000; int n,m; ...

  2. [Luogu 1850] noip16 换教室

    [Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...

  3. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  4. 记lrd的高二上学期第五次调研考试

    河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...

  5. 1009: [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...

  6. mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风

    (-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...

  7. js封装用户选项传递给Servlet之考试系统二

    <%@ page language="java" import="java.util.*" contentType="text/html; ch ...

  8. js动态生成选项之考试系统(一)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  9. 分享一个LiteDB做的简单考试系统辅助工具

    凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...

随机推荐

  1. Aria2 任意文件写入

    访问aria2,发现服务已启动并且返回404页面 打开http://binux.github.io/yaaw/demo/#打开yaaw,点击配置按钮,填入运行aria2的目标域名:http://you ...

  2. 缩减Azure上Linux虚拟机系统盘容量

    [话在前头] 这么些年微软 Azure 创建虚拟机一直不能修改系统盘大小,但很多时候实际又用不了这么大的操作系统磁盘.微软自己甚至还针对 Windows 服务器镜像推出一个 smalldisk 的镜像 ...

  3. 如何将代码优雅的插入到word中

    介:写博客或者word时需要插入代码,但如何更优雅的将代码插入到word中呢? 反面教材如下: 技巧步骤1:插入表格,设置表格无边框: 技巧步骤2:使用Notepad++的高级功能: 大部分代码编辑器 ...

  4. SpringBoot开发十五-发布帖子

    需求介绍 使用 AJAX 异步通信实现网页能够增量的更新呈现到页面上而不需要刷新整个页面. 现在基本上都是服务器返回 JSON 字符串来解析 代码实现 使用 JQuery 发送 AJAX 请求. 首先 ...

  5. iNeuOS工业互网平台,在纸业领域的成功应用案例

    目       录 1.      项目背景... 2 2.      项目基本情况... 3 3.      概念解释... 5 1.   项目背景 最终用户是全国第5大纸业集团之一,年浆纸产能40 ...

  6. 更好地使用Atom支持基于Jupyter的Python开发

    有关于使用Atom进行Python开发的网上资料比较少,最近发现使用Atom结合Hydrogen插件进行Python开发,尤其是数据挖掘相关的工作,整体体验要好于Vscode,Vscode虽然说也有连 ...

  7. VBA·Function的基础使用

    阅文时长 | 0.27分钟 字数统计 | 440字符 主要内容 | 1.引言&背景 2.基本结构 3.Demo示例 4.声明与参考资料 『VBA·Function的基础使用』 编写人 | SC ...

  8. STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...

  9. Longhorn,企业级云原生容器分布式存储 - K8S 资源配置示例

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...

  10. shell脚本基本使用教程

    sh脚本的固定第一行 #!/bin/bash 变量 #!/bin/bash var1=1 var2=2 var3=$[var1+var2] echo "$var3" 传达参数 sh ...