几何题,二次函数,化一下式子吧

设二次函数\(y=ax^2+bx\),对于一个线段\((x,y1)\),\((x,y2)\),与他相交的条件是\(y1<=ax^2+bx<=y2\)

对于\(ax^2+bx>=y1\),可以化为变量为\(a,b\)的一次函数\(b>=xa+\frac{y1}{x}\),这可以表示成(a-b)平面上的一个半平面...

如果一些线段的半平面交不为空,就说明存在一条抛物线可以经过他们

二分答案判断,时间复杂度\(O(nlogn)\)

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=2e5+100;
  7. struct Point{
  8. double x,y;
  9. Point(double xx=0,double yy=0){
  10. x=xx,y=yy;
  11. }
  12. };
  13. struct Vector{
  14. double x,y;
  15. Vector(double xx=0,double yy=0){
  16. x=xx,y=yy;
  17. }
  18. };
  19. struct Line{
  20. Point p;
  21. Vector v;
  22. double ang;
  23. int bh;
  24. Line(Point a=Point(),Vector b=Vector()){
  25. p=a,v=b;
  26. ang=atan2(v.y,v.x);
  27. }
  28. }q[maxn],b[maxn],c[maxn];
  29. int dcmp(double x){return fabs(x)<1e-17?0:(x>0?1:-1);}
  30. Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
  31. Point operator + (Point a,Vector b){return Point(a.x+b.x,a.y+b.y);}
  32. Vector operator * (double p,Vector a){return Vector(a.x*p,a.y*p);}
  33. double operator * (Vector a,Vector b){return a.x*b.y-a.y*b.x;}
  34. double operator * (Point a,Point b){return a.x*b.y-a.y*b.x;}
  35. bool operator < (Line x,Line y){return dcmp(x.ang-y.ang)==0?(dcmp(x.v*(y.p-x.p))>0):(x.ang<y.ang);}
  36. Point glt(Line x,Line y){Vector v=x.p-y.p; return x.p+y.v*v/(x.v*y.v)*x.v;}
  37. bool onright(Line a,Line b,Line t){Point p=glt(a,b); return dcmp(t.v*(p-t.p))<0;}
  38. bool bpm(int x,int n,Line *b){
  39. int l=0,r=1,tot=0;
  40. for(int i=1;i<=n;i++)
  41. if(b[i].bh<=x){
  42. if(b[i].ang!=b[i-1].ang) tot++;
  43. c[tot]=b[i];
  44. }
  45. n=tot,q[0]=c[1],q[1]=c[2];
  46. for(int i=3;i<=n;i++){
  47. while(l<r&&onright(q[r],q[r-1],c[i])) r--;
  48. while(l<r&&onright(q[l],q[l+1],c[i])) l++;
  49. q[++r]=c[i];
  50. }
  51. while(l<r&&onright(q[r],q[r-1],q[l])) r--;
  52. while(l<r&&onright(q[l],q[l+1],q[r])) l++;
  53. return r-l>=2;
  54. }
  55. int n,m;
  56. double x,sy,ty;
  57. int main(){
  58. scanf("%d",&m);
  59. for(int i=1;i<=m;i++){
  60. scanf("%lf%lf%lf",&x,&sy,&ty);
  61. b[++n]=Line(Point(0,sy/x),Vector(1,-x));
  62. b[n].bh=i;
  63. b[++n]=Line(Point(0,ty/x),Vector(-1,x));
  64. b[n].bh=i;
  65. }
  66. sort(b+1,b+n+1);
  67. int l=1,r=n+1,mid,ans;
  68. while(l<r){
  69. mid=l+r>>1;
  70. if(bpm(mid,n,b))
  71. ans=mid,l=mid+1;
  72. else
  73. r=mid;
  74. }
  75. printf("%d\n",ans);
  76. return 0;
  77. }

Luogu-3222 [HNOI2012]射箭的更多相关文章

  1. BZOJ 2732: [HNOI2012]射箭

    2732: [HNOI2012]射箭 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2532  Solved: 849[Submit][Status] ...

  2. [Luogu 3224] HNOI2012 永无乡

    [Luogu 3224] HNOI2012 永无乡 特别水一个平衡树题. 不认真的代价是调试时间指数增长. 我写的 SBT,因为 Treap 的 rand() 实在写够了. 用并查集维护这些点的关系, ...

  3. BZOJ2732:[HNOI2012]射箭——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2732 https://www.luogu.org/problemnew/show/P3222#su ...

  4. [bzoj2732][HNOI2012]射箭

    Description 沫沫最近在玩一个二维的射箭游戏,如下图所示,这个游戏中的$x$轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于$(0, ...

  5. [HNOI2012]射箭

    Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...

  6. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

  7. luogu P3226 [HNOI2012]集合选数

    luogu 因为限制关系只和2和3有关,如果把数中2的因子和3的因子都除掉,那剩下的数不同的数是不会相互影响,所以每次考虑剩下的数一样的一类数,答案为每类数答案的乘积 如果选了一个数,那么2的因子多1 ...

  8. BZOJ 2731 Luogu P3219 [HNOI2012]三角形覆盖问题 (扫描线)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=2731 (luogu)https://www.luogu.org/probl ...

  9. bzoj2732: [HNOI2012]射箭 半平面交

    这题乍一看与半平面交并没有什么卵联系,然而每个靶子都可以转化为两个半平面. scanf("%lf%lf%lf",&x,&ymin,&ymax); 于是乎就有 ...

  10. 2732: [HNOI2012]射箭( 半平面交 )

    很久没写题解了= =,来水一发吧= = 首先这道题很明显就是求y=ax^2+bx的是否有值取,每一个式子都代表着两个半平面,然后直接半平面交就行了 借鉴了hzwer的代码,还是特别简洁的说 CODE: ...

随机推荐

  1. Chromium开发--入门C++小样例

      開始做Chromium开发的时候,都是从代码去摸索的,如今有几个样例了.希望看到的同学能有帮助,比直接在大量代码里领悟要快非常多了. C++ in Chromium 101 - Codelab h ...

  2. VLC 媒体播放器

    VLC 媒体播放器 VLC 媒体播放器是一个便携式. 免费.开源. 跨平台的媒体播放器. VideoLAN 项目的流式媒体服务器.分为Windows Phone版本和Android版本. 下载地址: ...

  3. 【RSS】我的RSS使用介绍

    早就想写一个有关RSS的文章,一直没时间,今天刚好被现DL说了一波,那就先整理出一篇教程吧.后续说不定还有分享: 分享相关PPT: 一.我使用的服务: Feedly:https://feedly.co ...

  4. nginx + uwsgi + django/flask Nginx + php-fpm + PHP

    后端服务器设置nginx + uwsgi + django/flask需要注意的问题 - ACE开发者 https://acejoy.com/2018/09/09/547/ 后端开发应用中,除了Ngi ...

  5. JavaScript事件onblur与onfocus区别

    一.onblur 1.1 说明 onblur属性在元素失去焦点时触发,onblur常用于表单验证代码(例如用户离开表单字段). 1.2 示例 <input type="text&quo ...

  6. PHP替换字符串-str_replace

    实例 把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai": <?php echo str_ ...

  7. 如何理解Comparator接口中的升降序?

    import java.util.*; class DescType implements Comparator { public int compare(Object o1, Object o2) ...

  8. Git中如何将代码恢复到之前某个节点

    本文主要讲如何使用小乌龟软件将代码恢复到之前某个节点. 一 说明 在实际项目开发中,都是很多人一起联合开发,往往会遇到这种情况:马上要发版本了,突然发现一个致命BUG,而这个BUG是由于某个小伙伴修改 ...

  9. JS续

    JS中的事件 [JS中的事件分类] * 1.鼠标事件: * click/dbclick/mouseover/mouseout/mousemove/mousedown/mouseup * * 2.键盘事 ...

  10. 异常处理、socket基于TCP协议编程

    一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...