题目链接

  考虑旋转卡壳求出一个最远点对之后删掉其中一个点,把该点到其余所有点的距离存进堆里……

  最后堆输出答案。

  我的代码只有在开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远点对(寄蒜几盒)的更多相关文章

  1. <QluOJ2018NewCode>计算几何(寄蒜几盒)

    题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...

  2. Solution -「NOI.AC 省选膜你赛」寄蒜几盒

    题目 题意简述   给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原 ...

  3. NOIWC2018滚粗记

    Day0 \(THUWC\)刚刚结束..顺利的滚粗了 Day1 整理一下自己咸鱼的心 下午到学校坐车出发 这次队伍浩大THUWC只有4个 又到了雅礼洋湖这个地方 路上突然多了许多有关\(NOI\)的标 ...

  4. 2018.11.26 QLU新生赛部分题解

    问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...

  5. CF1146H Satanic Panic

    题目传送门 Description 给定二维平面内\(n\)个点\((n\leq 300)\),求能组成五角星(不要求正五角星)的五元组个数. Solution 一道小清新的寄蒜几盒计算几何题,代码不 ...

  6. 2019学军集训记&PKUWC2020游记

    题解:https://www.cnblogs.com/gmh77/p/12051260.html 集训(×) 被虐(√) Day1 二段考 Day2 绝对不鸽 没那回事 还在路上 其实就是咕了两天 晚 ...

  7. NOIp2018集训test-9-18

    T1.Conjugate 只能选没选过的点,看成如果选了选过的堆的点就不管它继续选.如果第一次选到某一堆的点在第一次选到第一堆的点之前,这一堆对答案就会有1的贡献.那么a[i]有贡献的概率是a[i]和 ...

  8. 2018.11.25 齐鲁工业大学ACM-ICPC迎新赛正式赛题解

    整理人:周翔 A 约数个数(难) 解法1:苗学林  解法2:刘少瑞   解法3:刘凯  解法4:董海峥 B Alice And Bob(易) 解法1:周翔  解法2:苗学林  解法3:刘少瑞 C 黑白 ...

  9. Tarjan/2-SAT学习笔记

    Tarjan/2-SAT Tags:图论 作业部落 评论地址 Tarjan 用来求割边或者割点,求点双联通分量或者边双联通分量 点双联通分量:两个点之间有两条点不相交的路径 边双联通分量:两个点之间有 ...

随机推荐

  1. 洛谷 P2827 蚯蚓

    题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...

  2. NGUI类之间的关系架构

    NGUI Drawcall 1.使用同一个altals的元素尽量放在同一个UIPanel下面,在NGUI中,它消耗的drawcall是以每个Panel为独立计算单位进行计算的. 2.如果一个UIPan ...

  3. Android(java)学习笔记118:BroadcastReceiver之 外拨电话的广播接收者

    1. 外拨电话的广播接收者: 首先我们示例工程一览表如下: (2)首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中 ...

  4. [学习笔记] SSD代码笔记 + EifficientNet backbone 练习

    SSD代码笔记 + EifficientNet backbone 练习 ssd代码完全ok了,然后用最近性能和速度都非常牛的Eifficient Net做backbone设计了自己的TinySSD网络 ...

  5. 什么样子的WordPress网站更受搜索引擎欢迎

    网站的导航功能对于搜索引擎而言是非常重要的 网站的导航功能对于帮助用户迅速找到他们想要的内容来说是很重要的.它对帮助搜索引擎理解该网站有哪些重要内容同样非常重要.虽然百度的搜索结果都是指向每一个特定的 ...

  6. Asp.Net Core 进阶(四)—— 过滤器 Filters

    一.介绍 Asp.Net Core Filter 使得可以在请求处理管道的特定阶段的前后执行代码,我们可以创建自定义的 filter 用于处理横切关注点. 横切关注点的示例包括错误处理.缓存.配置.授 ...

  7. python plt 保存jpg出错

    pip install pillow就可以解决

  8. Python语言编写脚本时,对日期控件的处理方式

    对日期控件,日期控件的输入控一般是不能手动输入的:把readonly属性去掉就好 其实很简单,我们不去搞时间日期空间,我们把它当成一个普通的input框处理就好了! 但是,很多此类型input框都是禁 ...

  9. Bootstrap历练实例:默认的进度条

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. Bootstrap 页面标题(Page Header)

    Bootstrap页面标题(PageHeader)是个不错功能,它会网页的标题的四周添加适当的间距,当一个网页中有多个标题并且每个标题之间需要添加一定适当的间距,使用页面标题是非常有用的.如果需要使用 ...