牛客巅峰赛12th C.一起来看流星雨(旋转卡壳&三分)

题意:给定二维平面nnn个点,每个点有个速度向量,求最开始距离最远的两个点在运动过程中的最小距离。

思路:求距离最远的两个点就凸包grahamgrahamgraham扫描,然后跑rotatingicalipersrotatingi\ calipersrotatingi calipers,因为运动的过程是一个单峰函数,所以三分就可以了。

为啥我写的cmpcmpcmp函数换以下就会段错误,好离谱的错误,debugdebugdebug了一天。

/*bool cmp(P u,P v){ double t=cross(u,v,a[1]);if(t<0||(t==0&&dis(u,a[1])>dis(v,a[1]))) return 0;return 1;
}
*/
下面这样写就AC了,上面就只能过90%,然后段错误。
bool cmp(P u,P v){  double t=cross(u,v,a[1]);return (t>0)||(t==0&&dis(u,a[1])<dis(v,a[1]));
}

grahamgrahamgraham扫描(利用了极角排序)代码

const int N=1e4+10;
const double eps=1e-5;
int n,top;
struct P{double x,y;
}a[N],s[N];
double cross(P a,P b,P c){  return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dis(P a,P b){    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
/*bool cmp(P u,P v){    double t=cross(u,v,a[1]);if(t<0||(t==0&&dis(u,a[1])>dis(v,a[1]))) return 0;return 1;
}
*/
bool cmp(P u,P v){  double t=cross(u,v,a[1]);return (t>0)||(t==0&&dis(u,a[1])<dis(v,a[1]));
}
void graham(){a[0].x=a[0].y=1e9;int id=1;for(int i=1;i<=n;i++)if(a[i].x<a[0].x||(a[i].x==a[0].x&&a[i].y<a[0].y)) a[0]=a[i],id=i; swap(a[1],a[id]);sort(a+2,a+n+1,cmp);s[++top]=a[1],s[++top]=a[2];for(int i=3;i<=n;){//   printf("%f\n",cross(s[top-1],a[i],s[top]));if(top>1&&cross(s[top-1],a[i],s[top])>=0) --top;else s[++top]=a[i++];}
}
double rt_cp(){ //rotating calipers(旋转卡壳) if(top==2) return dis(s[1],s[2]); s[top+1]=s[1];int j=2;double ans=0;for(int i=1;i<=top;i++){while(fabs(cross(s[i],s[i+1],s[j]))<fabs(cross(s[i],s[i+1],s[j+1]))) j=j%top+1;ans=max(ans,dis(s[i],s[j]));}return ans;
}
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* * @param n int整型 流星个数* @param star int整型vector<vector<>> 流星坐标点和速度向量* @return double浮点型*/double solve(int m, vector<vector<int> >& star) {// write code hereauto fun = [&](double x) -> double {n=m,top=0;for(int i=0;i<n;++i) a[i+1]={star[i][0]+star[i][2]*x, star[i][1]+star[i][3]*x};graham();// printf("%f %f\n",x,sqrt(rt_cp()));return sqrt(rt_cp());};double l=0,r=1e9; for(int i=1;i<=100;i++){double lm=l+(r-l)/3,rm=r-(r-l)/3;if(fun(lm)<fun(rm)) r=rm;else l=lm; //printf("%d\n",top);}return fun(l);}
};

Andrew分下凸包和上凸包求,不用极角排序。

const int N=1e4+10;
const double eps=1e-5;
int n,top;
struct P{double x,y;bool operator<(const P&p)const{return y==p.y?x<p.x:y<p.y;}
}a[N],s[N];
double cross(P a,P b,P c){  return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dis(P a,P b){    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void graham(){sort(a+1,a+n+1);s[top=1]=a[1];for(int i=2;i<=n;){// printf("%f\n",cross(s[top-1],a[i],s[top]));if(top>1&&cross(s[top-1],a[i],s[top])>=0) --top;else s[++top]=a[i++];}int tmp=top;for(int i=n-1;i;){//   printf("%f\n",cross(s[top-1],a[i],s[top]));if(top>tmp&&cross(s[top-1],a[i],s[top])>=0) --top;else s[++top]=a[i--];}// printf("top=%d\n",top);if(n>1) top--;//因为多了一个1号结点 要去掉
}
double rt_cp(){ //rotating calipers(旋转卡壳) if(top==2) return dis(s[1],s[2]); s[top+1]=s[1];int j=2;double ans=0;for(int i=1;i<=top;i++){while(fabs(cross(s[i],s[i+1],s[j]))<fabs(cross(s[i],s[i+1],s[j+1]))) j=j%top+1;ans=max(ans,dis(s[i],s[j]));}return ans;
}
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* * @param n int整型 流星个数* @param star int整型vector<vector<>> 流星坐标点和速度向量* @return double浮点型*/double solve(int m, vector<vector<int> >& star) {// write code hereauto fun = [&](double x) -> double {n=m;for(int i=0;i<n;++i) a[i+1]={star[i][0]+star[i][2]*x, star[i][1]+star[i][3]*x};graham();// printf("%f %f\n",x,sqrt(rt_cp()));return sqrt(rt_cp());};double l=0,r=1e9; for(int i=1;i<=100;i++){double lm=l+(r-l)/3,rm=r-(r-l)/3;if(fun(lm)<fun(rm)) r=rm;else l=lm; //printf("%d\n",top);}return fun(l);}
};

牛客巅峰赛12th C.一起来看流星雨(旋转卡壳三分)相关推荐

  1. 牛客网赛码网 输入输出格式

    目录 牛客网&赛码网输入输出 牛客网 单行输入 多行输入,每一行是一个测试样例 多个测试用例,每个测试用例有多行 赛码网 单个输入,单个输出 单行多个输入,单行多个输出,空格分割 多个测试案例 ...

  2. 牛客网赛码网 输入输出格式 pythonC++

    牛客网&赛码网 输入输出格式 python&C++ Note: 你的程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果,举个例子,你可以使用c语言的scan ...

  3. 牛客网赛码网输入输出总结(python版)

    1. 单行输入: n, m = map(int, sys.stdin.readline().strip().split()) 对该行中所有元素取整型后赋给等式左边若干参数 2. 多行输入: 先获取第一 ...

  4. 牛客网 赛码网 js输入输出

    牛客网 详细地址 let readline = require('readline') const r1 = readline.createInterface({input: process.stdi ...

  5. 牛客小白赛190615场

    夜色已经很晚了,所以我长话短说 1.表单 链接:https://ac.nowcoder.com/acm/contest/917/C 来源:牛客网 输入描述: 第一行两个整数n,Q 后n行每行一个字符串 ...

  6. oj记录 牛客 高校赛 C派蒙的奇妙冒险------石之海

    题目描述 链接:https://ac.nowcoder.com/acm/contest/33869/C 来源:牛客网 题意 思路 其实只需要判断有没有素数即可,因为最少的染色策略是让所有的素数的颜色相 ...

  7. 牛客网 赛码在线编程中数据读取问题

    一. 数据读取的方式(python3) 1.  input()读取输入数据 while True:try:inputs = input()except:break 2.  网站的数据输入是是一个含有多 ...

  8. c-英语作文(牛客新生赛)

    链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 在写英语作文的时候,两个相同单词靠的太近肯定不好.现在 ZHR 给了你一段nnn个单词的英文,问你有多少对相同单词中间间隔的单词数 ...

  9. 牛客小白赛7 B自杀游戏 (博弈论,SG函数)

    链接:https://www.nowcoder.com/acm/contest/190/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

最新文章

  1. Android实现Parcelable对象序列化的实例
  2. 将字符串中的URL 解析,获取内容
  3. linux 静态编译 yara
  4. 44response对象
  5. Readonly 与Const
  6. 【PyTorch 】interpolate()==>上下采样函数
  7. 一文带你纵览 200+ 大规模机器学习研究
  8. 图书馆管理系统项目思路
  9. 百度地图利用位置提供服务器,利用百度地图API获取当前位置信息的实例
  10. 过程日志定位疑难问题
  11. IDEA下载并安装SVN教程
  12. 赋能泉城 2017中国软件生态大会再下一城
  13. 判断一个数是不是质数(素数),3种方式介绍
  14. WARN: Establishing SSL connection without server‘s identity verification
  15. Excel如何实现多条件计数统计
  16. 大一上课设——贪吃蛇(链表 + easyx)
  17. java 单链表一元多项式_java单链表实现一元多项式加法和乘法运算
  18. React Native 集成极光推送 jpush-react-native
  19. 《我是一只IT小小鸟》连载四
  20. 【转】一个拿到人人网和淘宝网offer的大四学生的Android学习经历

热门文章

  1. 零售行业数据分析运用
  2. 火车运输(NOIP2013)
  3. 一个大学毕业生的反思《下》
  4. nodejs-5.1 ejs模板引擎
  5. 项目支付接入支付宝【沙箱环境】
  6. 让ADSL宽带路由器更安全
  7. 计算机系统基础实验报告
  8. 购买运虚拟主机还是云服务器,购买运虚拟主机还是云服务器
  9. ios nslog 例子_iOS Runtime常用示例总结
  10. 史上最全亚马逊申诉模板!!!!