吐槽一句:话说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. 2019 牛客多校第二场 H Second Large Rectangle

    题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小 ...

  2. Python3 From Zero——{最初的意识:001~数据结构和算法}

    一.从队列两端高效插入.删除元素,及保留固定数量的数据条目: collections.deque([iterable[,maxlen=N]]) a = collections.deque([1, 2] ...

  3. 《转》python对象

    http://www.cnblogs.com/BeginMan/p/3160044.html 一.学习目录 1.pyhton对象 2.python类型 3.类型操作符与内建函数 4.类型工厂函数 5. ...

  4. centos yum install 找不到软件包

    yum install epel-release 然后再试试yum install 其他安装包

  5. 我写的第一个DELPHI的控制台程序,留作纪念。

    program Project2; {$APPTYPE CONSOLE} uses  SysUtils; const s = 'hello' ;  var a , b , c : integer; f ...

  6. js原型继承四步曲及原型继承图

    一:js原型继承四步曲 //js模拟类的创建以及继承 //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 //第一步:创建父类 fun ...

  7. python包的安装

    Microsoft Windows [版本 10.0.17134.228] (c) 2018 Microsoft Corporation.保留所有权利. C:\Users\Administrator& ...

  8. List<> ,string[]和string的相互转换

    1.string转换成string[]数组 string str = "aaa,bbb,ccc,dddd"; string[] strs = str.Split(','); 2.s ...

  9. 01.SpringMVC快速入门

    1.导入jar包 2.在web.xml中配置前端控制器 <!-- spring前端控制器 --> <servlet> <servlet-name>springmvc ...

  10. sql中取出字符串中数字

    select substring(reverse('0->星光'),PATINDEX('%[0-9]%',reverse('0->星光')),1)