YBTOJ:圈套问题(分治法、鸽笼原理)

文章目录

  • 题目描述
    • 数据范围
  • 解析
  • 代码

图片转载自: https://blog.csdn.net/weixin_43346722/article/details/118435430

题目描述

平面上有 n个点,用n个大小相同的圆分别将一个点作为圆心,同时满足圆圈不相交,求圆的最大半径。

数据范围

2<=n<=2e52<=n<=2e52<=n<=2e5

解析

把题目抽象一下就是求最小的一对点的距离除以2
考虑如何求呢?
暴力当然是会T飞的
首先把所有点按x排序
然后考虑分治
分治的关键是如何把两个小问题合并
暴力合并还是n方…
我们考虑剪掉一些不必要的比较
设两边分别得到的答案的最小值为a
那么x距离大于a的肯定不用比了
但是一旦x的距离全在a里面咋办?
同理,我们按y再排一下序,y的距离大于a都不用算了
那么每个点对应的的计算范围大概就是这样:

在这里插入图片描述
那么这样就不会有很多点了吗?
我们还有一个了一个关键性质:左边和右边的点各自之间的距离都不小于a
那么右边这个矩形里能填的两两距离不小于a的点就不多了
关于这个,我们就要使用神奇的鸽巢原理
考虑矩形按照下面这个图分区:
在这里插入图片描述
每个小矩形的对角线长度小于a,所以每个矩形最多有一个点
所以大矩形内的点不超过6个
(同时我们把6个点放到四角和两长边的终点,其实也就可以构造出6个的方案)
所以我们每个点需要计算的点最多不超过6个
时间复杂度降为线性,问题得以解决
整体复杂度:nlognnlognnlogn(每次合并按ysort可能再大一些?)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
const int M=2e6+100;
#define ll long long
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}
int n,m;
struct node{double x,y;
}p[N],tmp[N],now[N];
bool cmpx(node a,node b){return a.x<b.x;}
bool cmpy(node a,node b){return a.y<b.y;}
double dis(node a,node b){//printf("  dis:");print(a);print(b);printf("%lf+%lf=%lf")return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void print(node o){printf("(%.2lf %.2lf)",o.x,o.y);}
double solve(int l,int r){if(l==r) return 2e9;int mid=(l+r)>>1;double res=min(solve(l,mid),solve(mid+1,r));int num=0,tot=0;for(int i=mid+1;i<=r;i++){if(p[i].x-p[mid].x>=res) break;tmp[++num]=p[i];//printf("tmp:");print(p[i]);putchar('\n');}for(int i=mid;i>=l;i--){if(p[mid+1].x-p[i].x>=res) break;now[++tot]=p[i];//printf("now:");print(p[i]);putchar('\n');}sort(tmp+1,tmp+1+num,cmpy);sort(now+1,now+1+tot,cmpy);int pre=1;for(int i=1;i<=tot&&pre<=num;i++){while(pre<=num&&now[i].y-tmp[pre].y>=res) pre++;for(int j=pre;tmp[j].y-now[i].y<res&&j<=num;j++){//printf("i=%d j=%d dis=%.2lf",i,j,dis(now[i],tmp[j]));print(now[i]);print(tmp[j]);putchar('\n');res=min(res,dis(now[i],tmp[j]));}}return res;
}
int main(){while(1){n=read();if(n==0) return 0;for(int i=1;i<=n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);}sort(p+1,p+1+n,cmpx);printf("%.2lf\n",solve(1,n)/2);}return 0;
}
/*
2 
0 0 
1 1 
2 
1 1 
1 1 
3 
-1.5 0 
0 0 
0 1.5 
0
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1598E-Staircases【计数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1598E 题目大意 给出一个nmn\times mnm的网格图&#xff0c;开始所有都是黑色的&#xff0c;qqq次取反一个格子的颜色&#xff0c;然后求楼梯的数量。 楼梯定义为全黑色的下/右交替的格子集。 1≤n,m≤1000,1≤q≤1041\le…

ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

一、前言在项目开发中&#xff0c;日志系统是系统的一个重要组成模块&#xff0c;通过在程序中记录运行日志、错误日志&#xff0c;可以让我们对于系统的运行情况做到很好的掌控。同时&#xff0c;收集日志不仅仅可以用于诊断排查错误&#xff0c;由于日志同样也是大量的数据&a…

532. 货币系统

532. 货币系统 题意&#xff1a; 有 n 种不同面额的货币&#xff0c;第 i 种货币的面额为 a[i]&#xff0c;每一种货币都有无穷多张&#xff0c;货币之间可以彼此代替&#xff0c;比如6等于两张3&#xff0c;问有多少种货币是不可替代的 题解&#xff1a; 我们换一个问…

概率期望题(期望 DP)做题记录

概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问&#xff1a;生成树的期望深度。 不 wei zhuo 捏&#xff0c;设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结点&#xff0c;深度大于 \(j\) 的概率。 考虑枚举一棵子树的大小&#xff0c;转移方程如下&#x…

[学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

文章目录引入概念全套模板变量声明updaterotate旋转splay操作insert插入delete删除查找x的位置查找第k大前驱/后继极小值-inf和极大值inf的作用例题&#xff1a;P3369 【模板】普通平衡树题目code声明一下&#xff0c;许多代码的注解都在模板代码里面写了的&#xff0c;所以正文…

2021.9.23模拟

前言 174pts 40502460 四个暴力分 qwq T1想切结果矩乘T飞了。。。 不要迷信矩乘&#xff0c;这玩意也是会T的… 考场 先看题 感觉T1和T最可做 T3期望想到zld的全排列大法了&#xff0c;但是似乎只能线性… T4是初始化加强版&#xff0c;思路倒是有&#xff0c;但是不想写&am…

AT1981-[AGC001C]Shorten Diameter

正题 题目链接:https://www.luogu.com.cn/problem/AT1981 题目大意 给出nnn个点的一棵树&#xff0c;每次你可以删除一个叶子&#xff0c;求最少的操作数使得树的直径长度不超过kkk。 1≤n,k≤20001\leq n,k\leq 20001≤n,k≤2000 解题思路 开始以为是dpdpdp啥的&#xff0c…

手写AspNetCore 认证授权代码

在普通的MVC项目中 我们普遍的使用Cookie来作为认证授权方式&#xff0c;使用简单。登录成功后将用户信息写入Cookie&#xff1b;但当我们做WebApi的时候显然Cookie这种方式就有点不适用了。在dotnet core 中 WebApi中目前比较流行的认证授权方式是Jwt (Json Web Token) 技术。…

FWT 学习笔记

FWT 学习笔记 学的时候比较匆忙&#xff0c;于是就学一个 \(\texttt{or,and,xor}\) 卷积跑路。 P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT) 前置知识&#xff1a;高维前缀和&#xff0c;下面前缀和的操作大多都是用高维前缀和来实现的。 设有两个长度为 \(2^n\) 的序列 …

大盗阿福

大盗阿福 题意&#xff1a; 长度为n的数组a&#xff0c;不能取连续的数&#xff0c;问所能取的最大值是多少 题解&#xff1a; 设dp[i][0]表示第i个数不选&#xff0c;dp[i][1]表示第i个数选 如果第i个数不选&#xff0c;那么第i-1个数可以选也可以不选&#xff0c;我们取最…

YBTOJ:采矿战略(线段树维护dp、树链剖分)

文章目录题目描述解析代码题目描述 所谓线段树维护dp&#xff0c;就是在线段树上维护dp &#xff08;逃&#xff09; 解析 把树剖一下后就变成了区间问题 考虑建一棵线段树&#xff0c;每一个结点都是一个背包 这样就能区间查询&#xff0c;也能带修了 这种做法复杂度其实并不…

【用皇宫三十六计生存法则带你走进LCT(动态树)】LCT概念+模板+例题【洛谷P3690 Link Cut Tree(动态树)】

文章目录LCT概念模板rotatoisrootsplayaccessmakerootsplitfindrootlinkcut封装版例题题目code普通版code封装版这篇博客主要是帮助大家理解各个模板及LCTLCTLCT的意思&#xff0c;方便理解&#xff0c;模板写法的理解在代码里有注释详解&#xff0c;如果要看原理的话&#xff…

AGC002(D~F)【Kruskal重构树,博弈论,dp】

正题 AT1998 [AGC002D] Stamp Rally【Kruskal重构树,倍增】 https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;qqq次询问两个人分别从x,yx,yx,y&#xff0c;要求总共经过zzz个点的情况下经过边的最大编号的最小值。 1≤n,m,q≤…

迈向现代化的 .Net 配置指北

1. 欢呼 .NET Standard 时代我现在已不大提 .Net Core&#xff0c;对于我来说&#xff0c;未来的开发将是基于 .NET Standard&#xff0c;不仅仅是 面向未来 &#xff0c;也是 面向过去&#xff1b;不只是 .Net Core 可以享受便利&#xff0c; .NET Framework 不升级一样能享受…

DP 套 DP

DP 套 DP 学习笔记 大致内容 DP 套 DP 就是将一个简单 DP 的状态压缩起来放到新的 DP 中当做状态进行 DP 的过程。 常用于计算简单 DP 的答案为 \(k\) 的转移方案的数量。 一般都需要 decode 和 recode 操作&#xff0c;这里和 插头DP/轮廓线DP 有异曲同工之妙&#xff01; 例题…

acwing提高组 第一章 动态规划

文章目录数字三角形模型最长上升子序列模型背包模型状态机模型状态压缩DP区间DP树形DP数位DP单调队列优化DP斜率优化DPoj链接数字三角形模型 AcWing 1015. 摘花生1357人打卡 AcWing 1018. 最低通行费1279人打卡 AcWing 1027. 方格取数1158人打卡 AcWing 275. 传纸条933人打卡 …

YBTOJ洛谷P2042:维护数列(平衡树)

文章目录题目描述解析删除区间插入数列修改&翻转区间和&最大子段和代码传送门题目描述 解析 阴间题… 这不是裸的板子吗&#xff1f; 国赛真的有人能把这题写出来吗… 应该算一道练习作用很强的题了 写完这题&#xff0c;各种平衡树维护区间操作的方法可以说是毕业了吧…

CAP 2.4版本发布,支持版本隔离特性

前言自从上次 CAP 2.3 版本发布 以来&#xff0c;已经过去了几个月的时间&#xff0c;这几个月比较忙&#xff0c;所以也没有怎么写博客&#xff0c;趁着2019年到来之际&#xff08;现在应该是2019年开始的时候&#xff09;&#xff0c;CAP也发布了2018年的最后一个大版本 2.4&…

AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】

正题 题目链接:https://www.luogu.com.cn/problem/AT2005 题目大意 开始有一个1∼n1\sim n1∼n依次排列的序列&#xff0c;然后QQQ次&#xff0c;第iii次把序列长度变为aia_iai​&#xff0c;不足的从前往后循环填充。 求最后每个数字的出现次数。 1≤n,q≤105,1≤ai≤10181…

多项式工业基础与全家桶

多项式工业基础与全家桶 开坑待填&#xff0c;放个常数巨大的板子先 别忘了这道题&#xff01;P3338 [ZJOI2014]力 #define Maxn 200005 #define mod 998244353 inline int ksm(int x,int ymod-2) {int ret1;for(;y;y>>1,x1ll*x*x%mod) if(y&1) ret1ll*ret*x%mod;ret…