题目链接

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

  最后堆输出答案。

  我的代码只有在开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. python爬虫之路——初识基本页面构造原理

    通过chrome浏览器的使用简单介绍网页构成 360浏览器使用右键审查元素,Chrome浏览器使用右键检查,都可查看网页代码. 网页代码有两部分:HTML文件和CSS样式.其中有<script& ...

  2. [神经网络]一步一步使用Mobile-Net完成视觉识别(一)

    1.环境配置 2.数据集获取 3.训练集获取 4.训练 5.调用测试训练结果 6.代码讲解 本文是第一篇,环境配置篇. 先打开tensorflow object detection api 看看需要什 ...

  3. Spring boot 配置异步处理执行器

    示例如下: 1. 新建Maven 项目 async-executor 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  4. iOSAES加密的实现

    +(NSData *)AES256ParmEncryptWithKey:(NSString *)key Encrypttext:(NSData *)text  //加密 { char keyPtr[k ...

  5. cocos2dx for lua A*寻路算法实现2

    关于A*算法的实现过程,简单来说就是一个计算权限的过程. 首先,创建一个地图节点类,"MapNode.lua" local MapNode = class("MapNod ...

  6. 转 Solr vs. Elasticsearch谁是开源搜索引擎王者

    转 https://www.cnblogs.com/xiaoqi/p/6545314.html Solr vs. Elasticsearch谁是开源搜索引擎王者 当前是云计算和数据快速增长的时代,今天 ...

  7. numpy学习(一)

    numpy数据类型 # numpy创建对象,numpy创建的对象是n阶矩阵,类似python中列表的嵌套 nd = np.array([[1,2,3,4,5],[2,3,4,6,5]])nd 结果: ...

  8. Tcl/Cmds

  9. SQL语句小练习

    一.创建如下表结构(t_book) Id         主键   自增一 bookName   可变长 20 Price   小数 Author    可变长20 bookTypeId    图书类 ...

  10. logging记录了其他操作的问题

    做atm作业的时候,记录转账操作的那个功能的文件里,同时也记录了增加账号和冻结账号的操作 2018-11-28 17:14:51,754 : transfer : INFO : 用户edward向用户 ...