博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019.02.21 bzoj2739: 最远点(决策单调性+分治)
阅读量:4685 次
发布时间:2019-06-09

本文共 1283 字,大约阅读时间需要 4 分钟。

题意简述:给一个N个点的凸多边形,求离每一个点最远的点。


思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可。

才不是因为博主懒得写二分+栈优化呢
代码:

#include
#define ri register intusing namespace std;inline int read(){
int ans=0; bool f=1; char ch=getchar(); while(!isdigit(ch)){
if(ch=='-')f^=1;ch=getchar();} while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return f?ans:-ans;}typedef long long ll;const int N=5e5+5;int n,ans[N];struct pot{
int x,y,id;}a[N<<1];inline ll dist(const pot&a,const pot&b){
return (ll)(a.x-b.x)*(a.x-b.x)+(ll)(a.y-b.y)*(a.y-b.y);}inline bool check(const int&p,const int&x,const int&y){
ll dx=dist(a[p],a[x]),dy=dist(a[p],a[y]); if(x
p+n)dx=-dx; if(y
p+n)dy=-dy; return dx==dy?a[x].id>a[y].id:dx
r||ql>qr)return; int mid=l+r>>1,qmid=ql; for(ri i=ql+1;i<=qr;++i)if(check(mid,qmid,i))qmid=i; ans[mid]=a[qmid].id; solve(l,mid-1,ql,qmid),solve(mid+1,r,qmid,qr);}int main(){
for(ri tt=read();tt;--tt){
n=read(); for(ri i=1;i<=n;++i)a[i].x=read(),a[i].y=read(),a[i].id=i,a[i+n]=a[i]; solve(1,n,1,n<<1); for(ri i=1;i<=n;++i)cout<
<<'\n'; } return 0;}

转载于:https://www.cnblogs.com/ldxcaicai/p/10582404.html

你可能感兴趣的文章
为什么wait()和notify()属于Object类
查看>>
Part2_lesson3---ARM寄存器详解
查看>>
深入理解vsto,开发word插件的利器
查看>>
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同!
查看>>
导入properties时的坑
查看>>
python——网络编程
查看>>
Spark的39个机器学习库
查看>>
Electron学习笔记(一)
查看>>
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
查看>>
配置NRPE的通讯
查看>>
VS2005编译VTK5.10.1
查看>>
shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
查看>>
总结上海永辉云商高级前端职位面试题集
查看>>
中国计算机学会推荐国际学术会议和期刊目录
查看>>
文本元素
查看>>
各种可以远程
查看>>
对服务器的认识
查看>>
分治法实现1-N的数字按字典序全排列组合 Java语言
查看>>
序列化 与 反序列化
查看>>
购物车
查看>>