吐槽一句:话说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. ADIS16405BMLZ

    GND,VCC,CS,DOUT,SCLK,DIN

  2. 最短路(模板Dtra

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; const i ...

  3. 如何使用Spring管理Filter和Servlet

    在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建.如果要在filter或者servlet中使用sprin ...

  4. Mybatis与Spring整合(CURD)

    项目采用Maven构建,用Junit进行测试,数据库是Mysql,连接池是c3p0,未测试缓存部分 1.Maven的“pom.xml”文件 <project xmlns="http:/ ...

  5. 服务启动脚本start_boot.sh

    vim start_boot.sh #!/bin/bash usage(){ echo "$0 [start|stop|usage]" } status_springboot(){ ...

  6. 去哪儿的 源码 个人解析(2) router

      1.引进路由 import Vue from 'vue' 2.使用路由 Vue.use(Router) 3.路由注册 export default new Router({ routes: [{ ...

  7. Yii2 在php 7.2环境下运行,提示 Cannot use ‘Object’ as class name

    出错原因是: Object是php7.2中的保留类名,不可以使用Object作为类的名称. The object name was previously soft-reserved in PHP 7. ...

  8. Mobox企业网盘回收站文件清空与恢复的管控

    1. Mobox系统提供了 个人网盘的回收站 2. Mobox系统提供了 针对公司及部门文档柜的回收站 Mobox系统对个人网盘的回收站可以做这样的限制 1)  可以通过安装程序 ,不出现 回收站 2 ...

  9. K-Anonymous Sequence

    K-Anonymous Sequence 给出一个递增的长度为n的序列\(\{a_i\}\),现在你可以进行一次操作,选择若干个数,分别减少任意一个正整数,定义权值为这些正整数之和,询问操作使得新序列 ...

  10. maven创建archetyp一直显示runing

    在maven的五分钟入门里面,有这样一个命令: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darc ...