0817NOIP模拟测试赛后总结
吐槽一句:话说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模拟测试赛后总结的更多相关文章
- 0823NOIP模拟测试赛后总结
考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...
- 0929CSP-S模拟测试赛后总结
70分31名滚粗. 赛后发现赛时得到的分数全都是暴力分…… T2打的三分跑都没跑……边界设错了……赛后稍微调了调多了15分…… 据说有15分的暴力分,那么另外15分就是只有一种选择的情况了…… (如果 ...
- 0924CSP-S模拟测试赛后总结
50分-rank28 我是第二机房垫底大垃圾. 赛时T1和T2其实想到了正解??安慰自己罢了. 真正的CSP-S的赛后你还能和主办方争论说自己其实想到了正解要求人家硬给你个省一不成?? 出题人不知道到 ...
- 0922CSP-S模拟测试赛后总结
连发三篇爆炸实录我的心态竟然还这么好…… 昨天题目的D2.稍难. 这也不是我连续拿倒数第一的理由. T1不会.赛时硬写了一个30分的三次方暴力.还有一个地方写挂了.如果不是数据足够水我就爆零了. 也就 ...
- 0917CSP-S模拟测试赛后总结
机房搬家后的首战,便是失利. 依旧是挂掉了.这次状态有大问题. 然而状态的问题归根结底还是实力不行. 大约一个小时左右我拿到了T1的部分分.赛时判断了一下大概是高分. (不过赛后发现确实不算什么太高的 ...
- 0910CSP-S模拟测试赛后总结
%%%外校参加国赛大佬kai神-rank1 ---------------以上选手实力开挂---------------- %%%skyh.NC锅-rank2 %%%神牛170-rank4 %%%迪哥 ...
- 0908CSP-S模拟测试赛后总结
我早就料到昨天会考两场2333 话说老师终于给模拟赛改名了啊. 距离NOIP祭日还有60天hhh. 以上是废话. %%%DeepinC无敌神 -rank1 zkt神.kx神.动动神 -rank2 有钱 ...
- 0907NOIP模拟测试赛后总结
120分rank26.我又被打回原型了…… 下午考的.中午由于种种原因并没有睡好.于是状态很差. 第一眼看题感觉T1是一道XX题.部分分竟然给这么肥 然后看T2.T3好像都还不是特别恶心的题目,挺常规 ...
- 0906NOIP模拟测试赛后总结
我进前十辣.然而有10个大佬去学LCT了于是没有考试. Dybala神和exzkt神分-rank1,奶风神和林哥分-rank3,wc.miemeng和DuanYue神140分-rank5. 我.ooo ...
随机推荐
- Devstack配置负载均衡,负载均衡版本V2
本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...
- 【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap.
对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了. 下面分为GET.POST.DELETE还有PUT的请求,说明@Path.@Query.@QueryMap.@Bo ...
- 初探分布式环境的指挥官ZooKeeper
目录 1. 从单机到集群,分布式环境中的挑战 1.1 集中式的特点 1.2 集中式的痛点 1.3 从单体到SOA的转变 1.4 分布式服务总体框架 1.5 分布式应用概述 2. ZK基本概念及核心原理 ...
- JAVA-基础(Stream流)
说起stream流大家的第一反应是io,但是实际上谁规定流一定是存在io包里呢?在java8中得益于Lambda表达式的函数式编程,引入了一个全新的概念,stream. 1.优势? 在java8之前我 ...
- lvs负载均衡连接
http://blog.csdn.net/zwz1984/article/details/45194377 http://blog.csdn.net/zwz1984/article/details/4 ...
- Theorem、Proposition、Lemma和Corollary等的解释与区别
Theorem:定理.是文章中重要的数学化的论述,一般有严格的数学证明. Proposition:可以翻译为命题,经过证明且interesting,但没有Theorem重要,比较常用. Lemma:一 ...
- Dubbo的服务请求失败怎么处理
dubbo启动时默认有重试机制和超时机制. 超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败, 重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认 ...
- thinkphp rabc权限总结
今天晚上把ThinkPHP的权限分配弄明白了,心里的包袱立刻放下了,感觉那个爽啊!稍微记录一下. 背景:CMS系统开发(17do). 项目分组:Admin(后台管理).Home(前台显示). Admi ...
- java 堆排,优先级队列,归并排序
堆排 堆排是基于二叉树而得来的 例如:对一个数组 可以转为二叉树: 二叉树特性父节点为 i , 左叶子节点为2i+1:右叶子节点为2i+2; 步骤分解: 1. 先从第一个非叶子节点(即下 ...
- Erlang学习记录:语法和特性
特性 大下排序:number < atom < reference < fun < port < pid < tuple < list < bit st ...