题目描述

  一个平面上有很多个点在运动。给你每个点的初始坐标和每个点的速度,求出最多有多少个点到00号店的距离同时不超过rr。

  n≤50000n\leq 50000

题解

  我们先把00号点平移到原点,并令它静止不动。这样每个其他的点的运动轨迹就可以看成一条直线,要求出最多有多少个点同时在圆内。然后就是求直线和圆的交点。然后把这些交点按照时间排序,第一次出现就是进入,第二次出现就是出去。直接扫一遍就可以了。

  求直线的方程&交点很简单,就是解几个方程,大家可以自己计算。设直线的方程为ax+by+c=0ax+by+c=0,圆的方程为x2+y2=r2x^2+y^2=r^2,交点的横坐标为xx,结果为

(a2+b2)x2+2acx+c2−b2r2=0

(a^2+b^2)x^2+2acx+c^2-b^2r^2=0
  时间复杂度:O(nlogn)O(n\log n)

  好吧。。。我还是放上计算过程吧

ax+by+ca(x−vx)+b(y−by)+cavx+bvyabc=0=0=0=vy=−vx=yvx−xvy

\begin{align} ax+by+c&=0\\ a(x-vx)+b(y-by)+c&=0\\ avx+bvy&=0\\ a&=vy\\ b&=-vx\\ c&=yvx-xvy\\ \end{align}

{x2+y2=r2ax+by=c

\begin{cases} x^2+y^2=r^2\\ ax+by=c \end{cases}

yx2+(c−axb)2(a2+b2)x2+2acx+c2−b2r2=c−axb=r2=0

\begin{align} y&=\frac{c-ax}{b}\\ x^2+{(\frac{c-ax}{b})}^2&=r^2\\ (a^2+b^2)x^2+2acx+c^2-b^2r^2&=0 \end{align}

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<cmath>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef pair<double,int> pdi;
void sort(int &a,int &b)
{if(a>b)swap(a,b);
}
void open(const char *s)
{
#ifndef ONLINE_JUDGEchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
struct point
{double x,y;point(double a=0,double b=0){x=a;y=b;}
};
point operator -(point a,point b)
{return point(a.x-b.x,a.y-b.y);
}
double dist(point a)
{return sqrt(a.x*a.x+a.y*a.y);
}
pdi f[100010];
int m;
double r;
double eps=1e-9;
double bx,by,bvx,bvy;
int sign(double x)
{return x>0;
}
int tot=0;
void solve(int id)
{double a,b,c;double x,y,vx,vy;scanf("%lf%lf%lf%lf",&x,&y,&vx,&vy);x-=bx;y-=by;vx-=bvx;vy-=bvy;if(fabs(vx)<eps&&fabs(vy)<eps){if(dist(point(x,y)-point())<r)tot++;return;}a=vy;b=-vx;//vy*x-vx*y+c=0c=vx*y-vy*x;point p1,p2;if(fabs(b)<=eps){if(x>r)return;p1=p2=point(x,sqrt(r*r-x*x));p2.y=-p2.y;f[++m]=pdi((p1.y-y)/vy,id);f[++m]=pdi((p2.y-y)/vy,id);return;}double A=a*a+b*b,B=2*a*c,C=c*c-b*b*r*r;if(B*B-4*A*C<0)return;double x1=(-B-sqrt(B*B-4*A*C))/(2*A);double x2=(-B+sqrt(B*B-4*A*C))/(2*A);p1=point(x1,-(a*x1+c)/b);p2=point(x2,-(a*x2+c)/b);f[++m]=pdi((p1.x-x)/vx,id);f[++m]=pdi((p2.x-x)/vx,id);
}
int e[100010];
int main()
{open("bzoj1580");int n;scanf("%d%lf%lf%lf%lf%lf",&n,&r,&bx,&by,&bvx,&bvy);int i;for(i=1;i<=n;i++)solve(i);sort(f+1,f+m+1);int s=0,ans=0;for(i=1;i<=m;i++){if(!e[f[i].second]){e[f[i].second]=1;s++;if(f[i].first>0)ans=max(ans,s);}else{if(f[i].first>0)ans=max(ans,s);s--;}}printf("%d\n",ans+tot);return 0;
}

【BZOJ1580】【USACO2009Hol】杀手游戏 计算几何相关推荐

  1. 手机软件:杀手游戏的法官助手,(人多的时候法官没有辅助,是很难记住各个角色的)...

    为什么做这个软件:    有一阵经常玩杀手游戏,不是在专门的场所玩,    法官是很难记住12个人以上的多种角色的,很多时候只能靠纸和笔来记,    但是有时候,我们是在外玩,纸和笔也不是很方便,这个 ...

  2. bzoj [Usaco2009 Hol]Cattle Bruisers 杀手游戏

    Description Input 第1行输入N,R,BX,BY, BVX,BVY,之后N行每行输入四个整数Xi,Yi,VXi,VYi. Output 一个整数,表示在逃脱过程中,某一个时刻最多有这个 ...

  3. BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力

    1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. 牛牛的装球游戏 (计算几何

    添加链接描述 #include<bits/stdc++.h> using namespace std; #define int long long double pi=3.14159265 ...

  5. 如何用Pygame写游戏(十七)

    本文转自http://eyehere.net/2011/python-pygame-novice-professional-17/ 最近有些忙,没有更新这个系列,不行啊不行,抓紧更新一篇,这几次可是3 ...

  6. c++小游戏合集(AI)

    目录 1.斗地主 2.杀人游戏 3.狼人杀 4.三国杀 1.斗地主 #include<bits/stdc++.h> #define PLAYERCOUNT 3 #define CARDSC ...

  7. C++ 原创 小游戏 狼人杀1.0

    狼人杀1.0(测试) 没错又是我 小镇2.0刚刚更新 一款全新的游戏 狼人杀 出世!!! 规则可能跟你们玩法的不太一样 见谅,谢谢!! 可能无法判定游戏是否结束 见谅!!! 创作不易,支持!!! 代码 ...

  8. 【Devc++】8款经典小游戏

    我在CSDN网站上收集了8款c++经典小游戏 1.贪吃蛇 /************************贪吃蛇***********************/ /***************** ...

  9. 2022年蓝桥杯省赛 C/C++ A组题解

    前言: NewOJ最新推出2022蓝桥杯省赛题目,数据均为管理员自行构造,仅供参考. 传送门:http://oj.ecustacm.cn/viewnews.php?id=1021. 题目总览 题目 T ...

  10. 什么是自动化运维?自动化运维必备技能有哪些?

    万丈高楼平地起,高楼稳不稳取决于地基是否扎实.基础数据便是运维管理这座高楼的地基. 首先介绍一下我们在运维管理中所涉及到的基础数据有哪一些.请看下图: 基础数据大致分为CMDB.日志.生产DB.知识库 ...

最新文章

  1. sed、grep、awk
  2. hadoop hive安装手记(转)
  3. 集合数百个常用工具类集合,V2.3.10.104
  4. MySQL添加新用户、为用户创建数据库、为新用户分配权限
  5. i 智慧 | 深度广度并举,AWS容器服务再推利器!
  6. python3类的继承详解_基于python3 类的属性、方法、封装、继承详解
  7. wincc按钮控制的vb脚本_VB操作wincc脚本心得.docx
  8. 搜索复习-基础水题(一共12道)
  9. xp 系统 mysql日志文件在哪里_SqlServer修改数据库文件及日志文件存放位置教程
  10. 2020-8-31 David Pozar 微波工程读书笔记 (三) 173115
  11. python爬虫爬天眼查失信守信企业的名称数据。
  12. 根据计算机配置设置bios,BIOS设置图解教程
  13. c语言获取随机数硬币问题,算法 – 从硬币中创建一个随机数生成器
  14. Android 常用控件详解
  15. 打印程序在计算机上的应用程序,什么是“后台打印程序子系统应用程序”(spoolsv.exe),以及为什么它在我的电脑上运行?...
  16. 如何区分电梯卡为id卡ic卡_UID卡是什么?和IC卡、ID卡有什么区别?
  17. 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码
  18. 电脑鼠标在右键时一直转圈不显示解决措施
  19. matlab实现5自由度雄克机器人的运动仿真
  20. Struts2 ognl判断集合对象是否为空的方法

热门文章

  1. 此处纸薄不经墨,待入章中再续貂
  2. springboot整合RabbitMQ启动报错:An unexpected connection driver error occured,Socket Closed
  3. An unexpected connection driver error occured错误(亲测有效)
  4. 南京旅游迈入大数据时代
  5. 3.9提取电话号的区号、电话号、分机号
  6. OKCC坐席号和分机号有什么区别?
  7. 10-Transformation
  8. 什么是 IoT App SDK?
  9. 仿百度糯米TP5项目笔记
  10. OpenSSL下载安装