【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 用来求割边或者割点,求点双联通分量或者边双联通分量 点双联通分量:两个点之间有两条点不相交的路径 边双联通分量:两个点之间有 ...
随机推荐
- JAVA小游戏之两个物体碰撞产生的碰撞检测
首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...
- [Docker] Docker安装和简单指令
Docker笔记 安装 sudo apt install docker.io 启动和关闭Docker服务 # 启动Docker服务 sudo service docker start # 关闭Dock ...
- Google 出品的 Java 编码规范,强烈推荐,权威又科学!
原文:google.github.io/styleguide/javaguide.html 译者:Hawstein 来源:hawstein.com/2014/01/20/google-java-sty ...
- Word2vec资料
Word2vec 很好的资料 Word2Vec-知其然知其所以然 https://www.zybuluo.com/Dounm/note/591752 Word2Vec数学原理讲解 http://w ...
- Dojo中的选择器
dom.byId(以前的dojo.byId):等同于js中的document.getElementById. http://www.cnblogs.com/tiandi/archive/2013/11 ...
- 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...
- iOS9适配总结
每年iOS升级,都会带来一些坑,这次iOS9也不例外.本文总结了微信在适配iOS9上遇到的问题和解决方案. 一.iOS9问题汇总 1. 编译问题(Bitcode) 大部分人升级到Xcode7后,首 ...
- 【二分 最小割】cf808F. Card Game
Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...
- java的面向对象 (2013-09-30-163写的日志迁移
1)面向对象的特征 1. 抽象:(从java方面来说抽象大多数人还是把它作为java中的一种特征来对待) 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象包括 ...
- python爬虫基础18-Chrome调试前端工具
01 Chrome调试 抓包工具原理 Chrome 开发者工具是一套内置在Google Chrome中Web开发和调试工具.使用开发者工具来重演,调试和剖析您的网站. 其中常用的有Elements(元 ...