【Luogu】P4357K远点对(寄蒜几盒)
考虑旋转卡壳求出一个最远点对之后删掉其中一个点,把该点到其余所有点的距离存进堆里……
最后堆输出答案。
我的代码只有在开O2的情况下才不会re。为啥????
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cctype>
#define maxn 300020
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Point{
long long x,y;
bool operator ==(const Point a){
return x==a.x&&y==a.y;
}
}q[maxn],stack[maxn],d[maxn],sta;
int top,cnt; inline long long multi(Point a,Point b,Point c){ return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); }
inline long long caldis(Point a,Point b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); }
inline int calcnxt(int a,int n){ int b=a+; if(b>n) b=; return b; }
inline bool cmp(Point a,Point b){ return multi(sta,a,b)!=?multi(sta,a,b)>:a.x<b.x; } long long heap[maxn*],size;
inline void push(long long x){
heap[++size]=x;
int i=size,k;
while(i>){
k=i>>;
if(heap[k]<=heap[i]) return;
swap(heap[k],heap[i]);
i=k;
}
return;
}
inline long long pop(){
long long ans=heap[]; heap[]=heap[size--];
int i=,k;
while(i*<=size){
k=i<<;
if(k<size&&heap[k]>heap[k|]) k|=;
if(heap[i]<=heap[k]) return ans;
swap(heap[i],heap[k]);
i=k;
}
return ans;
} void prepare(int from,int to,int deep){
if(deep==) return;
if(to-from<=){
for(int i=from;i<=to;++i) d[++cnt]=q[i];
return;
}
int now=from;
for(int i=from;i<=to;++i)
if(q[i].y<q[now].y||(q[i].y==q[now].y&&q[i].x<q[now].x)) now=i;
sta=q[now];
swap(q[now],q[from]);
sort(q+from+,q+to+,cmp);
top=;
stack[]=q[from]; stack[]=q[from+];
for(int i=from+;i<=to;++i){
while(top>&&multi(stack[top-],stack[top],q[i])<=) top--;
stack[++top]=q[i];
}
stack[++top]=stack[];
now=;
int ansa=from,ansb=from;
for(int i=;i<top;++i){
int nxt=calcnxt(now,top); while(multi(stack[i],stack[i+],stack[now])<=multi(stack[i],stack[i+],stack[nxt])){
now=nxt;
nxt=calcnxt(now,top);
}
if(caldis(stack[i],stack[now])>caldis(stack[ansa],stack[ansb])){
ansa=i; ansb=now;
}
if(caldis(stack[i+],stack[now])>caldis(stack[ansa],stack[ansb])){
ansa=i+; ansb=now;
}
}
d[++cnt]=stack[ansa]; d[++cnt]=stack[ansb];
for(int i=from;i<=to;++i)
if(q[i]==stack[ansa]){
swap(q[i],q[from]);
break;
}
for(int i=from+;i<=to;++i){
push(caldis(q[from],q[i]));
while(size>deep) pop();
}
} int main(){
int n=read(),m=read();
for(int i=;i<=n;++i) q[i]=(Point){read(),read()};
for(int i=;i<=m;++i) prepare(i,n,m);
printf("%lld\n",pop());
return ;
}
【Luogu】P4357K远点对(寄蒜几盒)的更多相关文章
- <QluOJ2018NewCode>计算几何(寄蒜几盒)
题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...
- Solution -「NOI.AC 省选膜你赛」寄蒜几盒
题目 题意简述 给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原 ...
- NOIWC2018滚粗记
Day0 \(THUWC\)刚刚结束..顺利的滚粗了 Day1 整理一下自己咸鱼的心 下午到学校坐车出发 这次队伍浩大THUWC只有4个 又到了雅礼洋湖这个地方 路上突然多了许多有关\(NOI\)的标 ...
- 2018.11.26 QLU新生赛部分题解
问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...
- CF1146H Satanic Panic
题目传送门 Description 给定二维平面内\(n\)个点\((n\leq 300)\),求能组成五角星(不要求正五角星)的五元组个数. Solution 一道小清新的寄蒜几盒计算几何题,代码不 ...
- 2019学军集训记&PKUWC2020游记
题解:https://www.cnblogs.com/gmh77/p/12051260.html 集训(×) 被虐(√) Day1 二段考 Day2 绝对不鸽 没那回事 还在路上 其实就是咕了两天 晚 ...
- NOIp2018集训test-9-18
T1.Conjugate 只能选没选过的点,看成如果选了选过的堆的点就不管它继续选.如果第一次选到某一堆的点在第一次选到第一堆的点之前,这一堆对答案就会有1的贡献.那么a[i]有贡献的概率是a[i]和 ...
- 2018.11.25 齐鲁工业大学ACM-ICPC迎新赛正式赛题解
整理人:周翔 A 约数个数(难) 解法1:苗学林 解法2:刘少瑞 解法3:刘凯 解法4:董海峥 B Alice And Bob(易) 解法1:周翔 解法2:苗学林 解法3:刘少瑞 C 黑白 ...
- Tarjan/2-SAT学习笔记
Tarjan/2-SAT Tags:图论 作业部落 评论地址 Tarjan 用来求割边或者割点,求点双联通分量或者边双联通分量 点双联通分量:两个点之间有两条点不相交的路径 边双联通分量:两个点之间有 ...
随机推荐
- windows server 2008 r2 启用 Windows Defender
单击“开始”,指向“管理工具”,然后单击“服务器管理器”. 在“服务器管理器”中,单击“功能”,然后在“服务器管理器”细节窗格中的“功能摘要”下,单击“添加功能”. 此时会启动“添加功能向导”. 在“ ...
- 【Orange Pi Lite2】 ——1《如何开始使用开源硬件》
[Orange Pi Lite2] --1<如何开始使用开源硬件> 本文只在博客园发布 在开始前你需要准备的材料与软件 用户手册_Orange Pi Lite2 OrangePi_Lite ...
- Update主循环的实现原理
从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已.游戏中存在一个帧的概念. 这个概念大家都知道,类比的话,它就是电影胶卷的格.一 ...
- cv2.Canny 边缘检测
Canny边缘检测 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘. 好的定位 - 标识出的边缘要尽可能与实际图像中 ...
- tpcc-mysql 实践
一.TPCC 介绍 TPC:全称Transaction Processing Performance Council (事务处理性能委员会),是一家非盈利性组织,该组织制定各种商业应用的基准测试规范, ...
- CRF条件随机场简介<转>
转自http://hi.baidu.com/hehehehello/item/3b0d1f8ba1c2e5c698255f89 CRF(Conditional Random Field) 条件随机场是 ...
- nfs-ganesha使用
一 nfs-ganesha在centos7上安装 yum -y install centos-release-gluster yum install -y nfs-ganesha.x86_64yum ...
- lua调用java过程
在cocos2dx框架中,有继承好的luaj文件来方便我们去使用lua调用java底层代码,注意:luaj只能使用在安卓平台下,如果在平台下使用,会出错, 所以使用前需要加平台判断,方法 如下: lo ...
- 救援(BFS)
题目描述: 在你的帮助下,Oliver终于追到小X了,可有一天,坏人把小X抓走了.这正是Oliver英雄救美的时候.所以,Oliver又找到哆啦A梦,借了一个机器,机器显示出一幅方格地图,它告诉Oli ...
- 转 消息队列之 RabbitMQ
转 https://www.jianshu.com/p/79ca08116d57 消息队列之 RabbitMQ 预流 2017.05.06 16:03* 字数 4884 阅读 80990评论 18喜欢 ...