【BZOJ1580】【USACO2009Hol】杀手游戏 计算几何
题目描述
一个平面上有很多个点在运动。给你每个点的初始坐标和每个点的速度,求出最多有多少个点到00号店的距离同时不超过rr。
n≤50000n\leq 50000
题解
我们先把00号点平移到原点,并令它静止不动。这样每个其他的点的运动轨迹就可以看成一条直线,要求出最多有多少个点同时在圆内。然后就是求直线和圆的交点。然后把这些交点按照时间排序,第一次出现就是进入,第二次出现就是出去。直接扫一遍就可以了。
求直线的方程&交点很简单,就是解几个方程,大家可以自己计算。设直线的方程为ax+by+c=0ax+by+c=0,圆的方程为x2+y2=r2x^2+y^2=r^2,交点的横坐标为xx,结果为
(a^2+b^2)x^2+2acx+c^2-b^2r^2=0
时间复杂度:O(nlogn)O(n\log n)
好吧。。。我还是放上计算过程吧
\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}
\begin{cases} x^2+y^2=r^2\\ ax+by=c \end{cases}
\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】杀手游戏 计算几何相关推荐
- 手机软件:杀手游戏的法官助手,(人多的时候法官没有辅助,是很难记住各个角色的)...
为什么做这个软件: 有一阵经常玩杀手游戏,不是在专门的场所玩, 法官是很难记住12个人以上的多种角色的,很多时候只能靠纸和笔来记, 但是有时候,我们是在外玩,纸和笔也不是很方便,这个 ...
- bzoj [Usaco2009 Hol]Cattle Bruisers 杀手游戏
Description Input 第1行输入N,R,BX,BY, BVX,BVY,之后N行每行输入四个整数Xi,Yi,VXi,VYi. Output 一个整数,表示在逃脱过程中,某一个时刻最多有这个 ...
- BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力
1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 牛牛的装球游戏 (计算几何
添加链接描述 #include<bits/stdc++.h> using namespace std; #define int long long double pi=3.14159265 ...
- 如何用Pygame写游戏(十七)
本文转自http://eyehere.net/2011/python-pygame-novice-professional-17/ 最近有些忙,没有更新这个系列,不行啊不行,抓紧更新一篇,这几次可是3 ...
- c++小游戏合集(AI)
目录 1.斗地主 2.杀人游戏 3.狼人杀 4.三国杀 1.斗地主 #include<bits/stdc++.h> #define PLAYERCOUNT 3 #define CARDSC ...
- C++ 原创 小游戏 狼人杀1.0
狼人杀1.0(测试) 没错又是我 小镇2.0刚刚更新 一款全新的游戏 狼人杀 出世!!! 规则可能跟你们玩法的不太一样 见谅,谢谢!! 可能无法判定游戏是否结束 见谅!!! 创作不易,支持!!! 代码 ...
- 【Devc++】8款经典小游戏
我在CSDN网站上收集了8款c++经典小游戏 1.贪吃蛇 /************************贪吃蛇***********************/ /***************** ...
- 2022年蓝桥杯省赛 C/C++ A组题解
前言: NewOJ最新推出2022蓝桥杯省赛题目,数据均为管理员自行构造,仅供参考. 传送门:http://oj.ecustacm.cn/viewnews.php?id=1021. 题目总览 题目 T ...
- 什么是自动化运维?自动化运维必备技能有哪些?
万丈高楼平地起,高楼稳不稳取决于地基是否扎实.基础数据便是运维管理这座高楼的地基. 首先介绍一下我们在运维管理中所涉及到的基础数据有哪一些.请看下图: 基础数据大致分为CMDB.日志.生产DB.知识库 ...
最新文章
- sed、grep、awk
- hadoop hive安装手记(转)
- 集合数百个常用工具类集合,V2.3.10.104
- MySQL添加新用户、为用户创建数据库、为新用户分配权限
- i 智慧 | 深度广度并举,AWS容器服务再推利器!
- python3类的继承详解_基于python3 类的属性、方法、封装、继承详解
- wincc按钮控制的vb脚本_VB操作wincc脚本心得.docx
- 搜索复习-基础水题(一共12道)
- xp 系统 mysql日志文件在哪里_SqlServer修改数据库文件及日志文件存放位置教程
- 2020-8-31 David Pozar 微波工程读书笔记 (三) 173115
- python爬虫爬天眼查失信守信企业的名称数据。
- 根据计算机配置设置bios,BIOS设置图解教程
- c语言获取随机数硬币问题,算法 – 从硬币中创建一个随机数生成器
- Android 常用控件详解
- 打印程序在计算机上的应用程序,什么是“后台打印程序子系统应用程序”(spoolsv.exe),以及为什么它在我的电脑上运行?...
- 如何区分电梯卡为id卡ic卡_UID卡是什么?和IC卡、ID卡有什么区别?
- 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码
- 电脑鼠标在右键时一直转圈不显示解决措施
- matlab实现5自由度雄克机器人的运动仿真
- Struts2 ognl判断集合对象是否为空的方法