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 ...
随机推荐
- C89,C99: C数组&结构体&联合体快速初始化
1. 背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组 ...
- 剑指offer——20删除链表中重复的结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- css中的zoom的作用
1.检查页面的标签是否闭合不要小看这条,也许折腾了你两天都没有解决的 CSS BUG 问题, 却仅仅源于这里.毕竟页面的模板一般都是由开发来嵌套的,而 他们很容易犯此类问题.快捷提示:可以用 Drea ...
- c++实现写一个函数,求2个整数的和,要求在函数体内不得使用+,-* /
#include <iostream> using namespace std; int add(int x, int y) { return x+y; } int addmove(int ...
- 推荐5本纯Java技术书,你看过几本?
51小长假了,大家应该对它又爱又痛,爱的是终于可以到处浪了,痛的是没钱只能穷游,而且还到处都是人,结果变成了堵高速.去看人头.去蒸饺子,真是受罪啊.. 所以,对于小长假的痛,我相信还是有一部分人会选择 ...
- sklearn参数优化
学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的 ...
- Milking Cows /// 区间计数 离散化排序 oj10105
题目大意: 输入n 接下来描述1~n位农夫挤牛奶的开始与结束时间 Sample Input 3300 1000700 12001500 2100 Sample Output 900 300 注意 ...
- 请求参数MD5加密---函数助手
- Python全栈开发:django网络框架(一)
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- 1分钟k线图能反映什么?(转)
对于投资者特别是短线操作者来讲,应该重视1分钟K线图,但是并不是所有的股票都能通过1分钟K线图看出名堂来,比如一些小盘股,盘子较轻,很容易上蹿下跳.仅用1分钟K线图分析其上证指数,很难研判大盘当日的高 ...