吐槽一句:话说NOIP都取消了还叫NOIP模拟真的好么

于是乎我再次爆炸……(0+20+50=70 rank26)


赛时状态

赛时的状态依旧不佳。不过还是硬逼着自己把三道题都读完,然后开始对出题人静坐示威。

突然意识到这是昨天那套题的day2。后悔昨天没机灵点颓一下。好吧也颓不到。毕竟昨天那套题的题解网上都找不到。

偷瞥了一眼机房其他人的状态,似乎都非常头疼的样子。一向嘈杂的机房甚至没有几声敲键盘键盘声。

嗯,我放心了。

继续抱头想T1,看着double的数据突然想到了二分答案。/滑稽

然后就没有然后了。想了一个多小时无果,决定弃坑。

码了一个T2的20分暴力,T3的20分暴力,然后开始等死。

(当时并没有意识到T3的随机数据还可以送20分,还有意外拿的水数据10分)

抱头想了半天没有一点思路。想二分不知不觉想到了模拟上,我最近真是打模拟打傻了……

然后T2xjb写了个骗分算法。

最后十分钟对拍一下表现我不屈的灵魂!

不到5分钟码出来随机数据生成器和对拍程序结果不知道哪里写挂了,到最后也没调出来。

然后以为自己代码写挂了,心态瞬间崩溃。

出成绩之后不敢看排行榜。闭着眼把进度条拉到最下面,偷偷睁眼看,呀没有我。

一名一名往上翻,不是,不是,不是,woc我是不是没交啊。

70分rank26。好吧,虽然炸了,但T3的50分确实是意外之喜。

赛题题解

T1:Star Way To Heaven

二分答案确实是正解之一。不过不应该照着模拟去想。

T80算法1:

二分距离最小值,给每一对距离小于这个最小值的点建边。

上边界设为0号点,下边界设为k+1号点,从上边界开始跑一趟dfs,如果能搜到k+1,则返回false,否则返回true

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
#define rint register int
using namespace std;
int n,m,k,tot,first[];
bool vis[];
struct node{int x,y;}p[];
struct node2{int u,v,nxt;}edge[<<];
inline double dist(int uu,int vv)
{
return (p[uu].x-p[vv].x)*(p[uu].x-p[vv].x)+
(p[uu].y-p[vv].y)*(p[uu].y-p[vv].y);
}
inline void add(int uu,int vv)
{
edge[++tot]=(node2){uu,vv,first[uu]};
first[uu]=tot;
}
inline void dfs(int x)
{
vis[x]=;
for(rint i=first[x];i;i=edge[i].nxt)
{
int y=edge[i].v;
if(!vis[y])dfs(y);
}
return ;
}
inline bool check(double x)
{
tot=;memset(first,,sizeof(first));
for(rint i=;i<k;++i)
for(rint j=i+;j<=k;++j)
if(dist(i,j)<*x*x)
add(i,j),add(j,i);
for(rint i=;i<=k;++i)
{
if(p[i].y<*x)add(,i),add(i,);
if(p[i].y+*x>m)add(i,k+),add(k+,i);
}
memset(vis,,sizeof(vis));
dfs();
return !vis[k+];
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(rint i=;i<=k;++i)
scanf("%d %d",&p[i].x,&p[i].y);
double l=,r=1e6;
while(r-l>1e-)
{
double mid=(l+r)/;
if(check(mid))l=mid;
else r=mid;
}
printf("%.8lf",l);
return ;
}

T80算法1(其实是w50,请读者自行手开long long/懒.jpg)

T80算法2:

依旧是二分,check操作改为并查集实现。原理大致相同。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
#define int long long
#define rint register int
using namespace std;
int n,m,k,tot,first[],fa[];
bool vis[];
struct node{int x,y;}p[];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline double dist(int uu,int vv)
{
return (p[uu].x-p[vv].x)*(p[uu].x-p[vv].x)+(p[uu].y-p[vv].y)*(p[uu].y-p[vv].y);
}
inline bool check(double x)
{
for(rint i=;i<=k+;++i)fa[i]=i;
for(rint i=;i<k;++i)
for(rint j=i+;j<=k;++j)
if(dist(i,j)<*x*x)
{
int lx=find(i),ly=find(j);
if(lx!=ly)fa[lx]=ly;
}
for(rint i=;i<=k;++i)
{
if(p[i].y<*x)
{
int lx=find(),ly=find(i);
if(lx!=ly)fa[lx]=ly;
}
if(p[i].y+*x>m)
{
int lx=find(k+),ly=find(i);
if(lx!=ly)fa[lx]=ly;
}
}
return find()!=find(k+);
}
signed main()
{
scanf("%lld %lld %lld",&n,&m,&k);
for(rint i=;i<=k;++i)
scanf("%lld %lld",&p[i].x,&p[i].y);
double l=,r=1e6,mid;
while(r-l>1e-)
{
mid=(l+r)/;
if(check(mid))l=mid;
else r=mid;
}
printf("%.8lf\n",mid);
return ;
}

T80算法2

AC算法:

考虑如何对T80算法2进行优化。

算法2的主要瓶颈在于并查集的合并中需要$(n^2)$搜一边,这样效率无疑是很低的。

根据并查集的特点,我们不妨预处理出每一个点左上、左下、右上、右下四个方向上最近的点。

不难发现,其他点若也能连接到该点,则一定能通过这四个点中的某一个连接到它。

于是我们每次对每一个点进行合并时只需要扫这四个点就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
#define int long long
#define rint register int
using namespace std;
int n,m,k,tot,first[],fa[];
int yh[][];
bool vis[];
struct node{int x,y;}p[];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline double dist(int uu,int vv)
{
return (p[uu].x-p[vv].x)*(p[uu].x-p[vv].x)+(p[uu].y-p[vv].y)*(p[uu].y-p[vv].y);
}
inline bool check(double x)
{
for(rint i=;i<=k+;++i)fa[i]=i;
for(rint i=;i<=k;++i)
for(rint j=;j<=;++j)
{
if(!yh[i][j])continue;
if(dist(i,yh[i][j])<*x*x)
{
int lx=find(i),ly=find(yh[i][j]);
if(lx!=ly)fa[lx]=ly;
}
} for(rint i=;i<=k;++i)
{
if(p[i].y<*x)
{
int lx=find(),ly=find(i);
if(lx!=ly)fa[lx]=ly;
}
if(p[i].y+*x>m)
{
int lx=find(k+),ly=find(i);
if(lx!=ly)fa[lx]=ly;
}
}
return find()!=find(k+);
}
signed main()
{
scanf("%lld %lld %lld",&n,&m,&k);
for(rint i=;i<=k;++i)
scanf("%lld %lld",&p[i].x,&p[i].y);
for(rint i=;i<=k;++i)
for(rint j=;j<=k;++j)
{
if(i==j)continue;
int dis=dist(i,j);
if(p[j].x<=p[i].x&&p[j].y<=p[i].y)
yh[i][]=(dis<dist(yh[i][],i))?j:yh[i][];
if(p[j].x>=p[i].x&&p[j].y<=p[i].y)
yh[i][]=(dis<dist(yh[i][],i))?j:yh[i][];
if(p[j].x>=p[i].x&&p[j].y>=p[i].y)
yh[i][]=(dis<dist(yh[i][],i))?j:yh[i][];
if(p[j].x<=p[i].x&&p[j].y>=p[i].y)
yh[i][]=(dis<dist(yh[i][],i))?j:yh[i][];
}
double l=,r=1e6,mid;
while(r-l>1e-)
{
mid=(l+r)/;
if(check(mid))l=mid;
else r=mid;
}
printf("%.8lf\n",mid);
return ;
}

Accepted 100 930 ms 604 KiB

0817NOIP模拟测试赛后总结的更多相关文章

  1. 0823NOIP模拟测试赛后总结

    考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...

  2. 0929CSP-S模拟测试赛后总结

    70分31名滚粗. 赛后发现赛时得到的分数全都是暴力分…… T2打的三分跑都没跑……边界设错了……赛后稍微调了调多了15分…… 据说有15分的暴力分,那么另外15分就是只有一种选择的情况了…… (如果 ...

  3. 0924CSP-S模拟测试赛后总结

    50分-rank28 我是第二机房垫底大垃圾. 赛时T1和T2其实想到了正解??安慰自己罢了. 真正的CSP-S的赛后你还能和主办方争论说自己其实想到了正解要求人家硬给你个省一不成?? 出题人不知道到 ...

  4. 0922CSP-S模拟测试赛后总结

    连发三篇爆炸实录我的心态竟然还这么好…… 昨天题目的D2.稍难. 这也不是我连续拿倒数第一的理由. T1不会.赛时硬写了一个30分的三次方暴力.还有一个地方写挂了.如果不是数据足够水我就爆零了. 也就 ...

  5. 0917CSP-S模拟测试赛后总结

    机房搬家后的首战,便是失利. 依旧是挂掉了.这次状态有大问题. 然而状态的问题归根结底还是实力不行. 大约一个小时左右我拿到了T1的部分分.赛时判断了一下大概是高分. (不过赛后发现确实不算什么太高的 ...

  6. 0910CSP-S模拟测试赛后总结

    %%%外校参加国赛大佬kai神-rank1 ---------------以上选手实力开挂---------------- %%%skyh.NC锅-rank2 %%%神牛170-rank4 %%%迪哥 ...

  7. 0908CSP-S模拟测试赛后总结

    我早就料到昨天会考两场2333 话说老师终于给模拟赛改名了啊. 距离NOIP祭日还有60天hhh. 以上是废话. %%%DeepinC无敌神 -rank1 zkt神.kx神.动动神 -rank2 有钱 ...

  8. 0907NOIP模拟测试赛后总结

    120分rank26.我又被打回原型了…… 下午考的.中午由于种种原因并没有睡好.于是状态很差. 第一眼看题感觉T1是一道XX题.部分分竟然给这么肥 然后看T2.T3好像都还不是特别恶心的题目,挺常规 ...

  9. 0906NOIP模拟测试赛后总结

    我进前十辣.然而有10个大佬去学LCT了于是没有考试. Dybala神和exzkt神分-rank1,奶风神和林哥分-rank3,wc.miemeng和DuanYue神140分-rank5. 我.ooo ...

随机推荐

  1. ssrf对redis未授权访问写webshell

    docker建立redis镜像 docker run -d -p 9999:6379 redis 将redis的6379端口映射到物理机的9999端口 使用工具生成攻击代码 攻击 进入容器查看

  2. SQLServer 安装失败可能的原因

    问题:安装的时候显示参数指定的目录无效 解决:你的安装盘使用了文件/文件夹压缩功能,去掉压缩属性即可! 建议不要轻易使用储存盘的压缩功能

  3. Java异常类及处理

    异常概述:运行时发生的不正常情况 在java中用类的形式对不正常的情况进行了描述和封装对象. 描述不正常的类,称之为异常类. 异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述 ...

  4. iphone11系统输入框的光标位置不正常

    本人的系统是11.3的是正常的,却发现测试机的11.1和11.2的光标位置在输入框的下边.百度一下,很多人有同样的问题,在此记录一下 解决办法一: //弹框弹出后执行如下代码 $('body').cs ...

  5. JS事件 光标聚焦事件(onfocus)当网页中的对象获得聚点时,执行onfocus调用的程序就会被执行

    光标聚焦事件(onfocus) 当网页中的对象获得聚点时,执行onfocus调用的程序就会被执行. 如下代码, 当将光标移到文本框内时,即焦点在文本框内,触发onfocus 事件,并调用函数messa ...

  6. CSIC_716_20191102【input、数据类型概述、运算符】

    1.与用户交互 python2和python3在与用户交互方面存在差异. 在python3中,使用input( )方法提供用户输入,而在python2中,使用raw_input( )方法,才能实现同样 ...

  7. LCD Common电压

    因为驱动液晶翻转靠的是两个玻璃电极上的电压差,而电压差是由电容提供的,电容一端接到S基,另一端接到一个基准电压上,这个电压就是Common电压.

  8. MySQL语句基本操作增删改查

    select * from 表名; --------->效率低

  9. 日志框架一logback配置和使用

    把logback或者log4j放在src/main/resources下,Spring容器就可以自动加载日志文件. 前言 Logback是由log4j创始人设计的又一个开源日志组件, 比log4j的性 ...

  10. 怎样配置duilib

    duilib是一个免费的界面库,它可利用xml文件自定义界面元素,并且可以在商业项目中无偿使用.怎样在VS中配置duilib界面库呢?请看下面的介绍. 工具/原料 duilib 下载和编译duilib ...