题面

传送门

题解

以下记\(S_i=\{1,2,3,...,i\}\)

我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点)

因为这个序列被\(random\_shuffle\)过,有\(E(\max(i,j))=O({2\over 3}n)\),即\(\max(i,j)\)的较大值的期望是\(O({2\over 3}n)\)。证明如下

\[\begin{aligned}
E(\max(i,j))
&={1\over n^2}\sum_{k=1}^nk\times (2k-1)\\
&={1\over n^2}\left(2\sum_{k=1}^nk^2-\sum_{k=1}^nk\right)\\
&={1\over n^2}\left({2n(n+1)(2n+1)\over 6}-{3n(n+1)\over 6}\right)\\
&={1\over n^2}\left({4n^3+3n^2-n\over 6}\right)\\
&=O({2\over 3}n)\\
\end{aligned}
\]

假设\(j>i\),那么对于\(S_{j+1},S_{j+2},...,S_n\),它们的答案都一样。然后对于剩下的继续做下去就可以了

我们来分析一下这玩意儿的时间复杂度是多少

\[T(n)=T({2\over 3}n)+O(n\log n)
\]

\[T(1)=O(1)
\]

嗯……我并不会主定理所以算不太动……不过我们可以考虑一个形如\(n+{2\over 3}n+{4\over 9}n+...+1\)的东西的求和,为了方便干脆直接将它写成无限求和的形式,那么可知它等于\(3n\),即\(O(n)\)。那么这里也类似,所以我们完全没有道理地证明了\(T(n)=O(n\log n)\)

话说不知道如果序列不\(random\_shufle\)有没有办法搞……

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define ll long long
#define pi pair<int,int>
#define fi first
#define se second
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R ll x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=7.5e5+5;
struct Point{
int x,y,id;
inline Point(){}
inline Point(R int xx,R int yy):x(xx),y(yy){}
inline Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}
inline Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}
inline ll operator *(const Point &b)const{return 1ll*x*b.y-1ll*y*b.x;}
inline ll norm()const{return 1ll*x*x+1ll*y*y;}
}q[N],p[N];int top,n;ll res,ans[N];pi qwq;
bool cmp(const Point &a,const Point &b){
R ll k=(a-p[0])*(b-p[0]);
return k?k>0:(a-p[0]).norm()<(b-p[0]).norm();
}
void solve(int r){
int k=0;p[0]=Point(inf,inf),top=0;
fp(i,1,r){
p[i]=q[i],p[i].id=i;
if(p[i].x<p[0].x||p[i].x==p[0].x&&p[i].y<p[0].y)k=i,p[0]=p[i];
}
swap(p[1],p[k]);
sort(p+2,p+1+r,cmp);
fp(i,1,r){
while(top>1&&(p[i]-p[top-1])*(p[top]-p[top-1])>=0)--top;
p[++top]=p[i];
}
p[top+1]=p[1];
res=0,qwq=make_pair(0,0);
for(R int i=1,j=2;i<=top;++i){
while((p[j+1]-p[i]).norm()>(p[j]-p[i]).norm())j=j%top+1;
if(cmax(res,(p[j]-p[i]).norm()))qwq=make_pair(p[i].id,p[j].id);
if(cmax(res,(p[j+1]-p[i+1]).norm()))qwq=make_pair(p[i+1].id,p[j+1].id);
}
if(qwq.fi>qwq.se)swap(qwq.fi,qwq.se);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)q[i].x=read(),q[i].y=read();
for(R int r=n;r!=1;r=qwq.se-1){
solve(r);
fp(i,qwq.se,r)ans[i]=res;
}
ans[1]=0;
fp(i,1,n)print(ans[i]);
return Ot(),0;
}

Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)的更多相关文章

  1. [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)

    http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...

  2. UVA 4728 Squares(凸包+旋转卡壳)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...

  3. poj 2079 Triangle (二维凸包旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u Submit Stat ...

  4. poj 2187 Beauty Contest(二维凸包旋转卡壳)

    D - Beauty Contest Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  5. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

  6. 【BZOJ-1069】最大土地面积 计算几何 + 凸包 + 旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2707  Solved: 1053[Submit][Sta ...

  7. [luogu1452]Beauty Contest【凸包+旋转卡壳】

    题目大意 求出平面最远点对距离的平方. 分析 此题我wa了好久,第一是凸包写错了,后面又是旋转卡壳写错了..自闭3s. 题解应该是旋转卡壳,但是有人用随机化乱搞过掉了Orz. 讲讲正解. 我们先求出所 ...

  8. [HNOI2007][BZOJ1185] 最小矩形覆盖 [凸包+旋转卡壳]

    题面 BZOJ题面 前置芝士 建议先学习向量相关的计算几何基础 计算几何基础戳这里 思路 用这道题学习一下凸包和旋转卡壳 首先是凸包部分 凸包 求凸包用的算法是graham算法 算法流程如下: 找到$ ...

  9. BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...

随机推荐

  1. 《计算机网络》谢希仁(第7版) 第四章 c语言http://c.biancheng.net/cpp/html/3137.html

    第四章 网络层 电信网使用面向连接的通信方式,使电信网络能够向用户提供可靠传输的服务. 互联网设计思路:网络层向上只提供简单灵活的.无连接的.尽最大努力交付的数据报(分组)服务. 网络层不提供可靠传输 ...

  2. Vue-cli 配置开发环境让测试服务器监听所有IP

    //config/inex.js // Various Dev Server settingshost: '0.0.0.0', // can be overwritten by process.env ...

  3. html5之history对象理解

    history对象之pushState,replaceState浏览器有一个history对象,用来保存浏览历史,用户可以通过点击浏览器的后退或前进按钮在历史记录中切换.之前对history的操作的A ...

  4. mybatis 和 mybatis-spring

    一. 1. 实体bean  package com.mybatisBean; public class User { private Integer id; private String name; ...

  5. 7.20 文本框内容 超出 显示 。。 和 split

    word-wrap:break-word; word-break:break-all; overflow:auto; split  去 :等 ,只要有: 就会在:两边 各生产一个值 ,所有 应习惯把最 ...

  6. powerdesigner 生成表备注

    第一步: 操作:Database-->Edit Current DBMS,进入下图页面, 然后分别将 Script-->Objects-->Table-->TableComme ...

  7. 在delphi XE5 里面编译kbmmw4.3

    Delphi XE5 仓促的发布了,虽然开始支持Android 开发了,但是经过试用,发现那个模拟器慢到无法用, 真机可以运行,但是调试也几乎无法用.由于XE5 的主要增加的是Android 的开发支 ...

  8. 2018.07.08 NOIP模拟 好数(线段树)

    好数 题目背景 SOURCE:NOIP2016-AHSDFZ T3 题目描述 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1. 这个数是 0 或 1 . 2. 所 ...

  9. DIV+CSS实战(一)

    一.说明 作为一个后台的程序员,我也是很少写前端,最近有一个项目,前端主要是由我来负责,就把我在项目中所学到的东西,记录下来!我的页面要嵌入到另一个系统中,所以,并不是按照传统的top,left,co ...

  10. JAVA开发常用计算机命令

    系统常用命令 win+r > control (可进入控制面板,管理工具,服务) win+r > cmd > systeminfo (x86-based 指32位系统,x86-64 ...