【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 用来求割边或者割点,求点双联通分量或者边双联通分量 点双联通分量:两个点之间有两条点不相交的路径 边双联通分量:两个点之间有 ...
随机推荐
- linux yum安装指定版本mysql
1.下载mysql rpm包 cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-.noarc ...
- Java 守护线程(Daemon) 例子
当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序.当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程 ...
- Beta冲刺(周四)
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作业要求在哪里 https://edu.cnblo ...
- python处理图片的一些操作
1.把图片分割成一个个竖条: from PIL import Image gap = 20 img_name = '/home/sensetime/000132_11_4.png' im = Imag ...
- CPP-基础:extern"C"
简介:extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的:其次,被它修饰的目标是“C”的.让我们来详细解读这两重含义. 含义: 1.被e ...
- java基础—面向对象2
一.JAVA类的定义
- 用promise封装ajax
首先贴代码 var ajaxOptions = { url: 'url', method: 'GET', async: true, data: null, dataType: 'text', } fu ...
- java开发微信公众号----开发者基本配置的
首先附上微信公众平台开发技术文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5 本文主要描 ...
- c++ 函数指针应用,定义一个方法,传入两个参数和一个函数指针,并返回结果
#include <iostream> #include <string> using namespace std; double add(double x, double y ...
- Linux-Mysql8.0
Mysql8.0.12 基本操作 解释 命令 安装服务端 yum install mysql-community-server 启动 service mysqld start/restart 停止 s ...