zoj2318
zoj2318
题意
一个平面上给出很多圆,其中一个圆为现在自己的位置,问这个圆能不能冲出其它圆的包围(不能与其它圆相交)。
分析
将所有圆心平移,使得自己的圆圆心处于原点,将所有圆半径增加自己圆的半径,这样自己的圆可以看成一个点,任意两圆相交我们都可以看作圆心间连了一条边,问题就转化成了一个点是否在一个多边形内,对于两点 \(A\) \(B\) ,我们可以把 \(A-B\) 这条有向边的权值置为角\(AOB\) 的角度,\(B-A\) 这条边的权值为角度取负,如果一个点在多边形内,那么跑一圈必然是 \(2*PI\) 或 \(-2*PI\) ,否则是 \(0\) ,跑一遍 \(Bellman-Ford\) 判断有无负环即可。
code
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e2 + 10;
const int MOD = 998244353;
const double EPS = 1e-9;
typedef long long ll;
int Sgn(double x) {
if(fabs(x) < EPS) return 0;
return x < 0 ? -1 : 1;
}
double Sqr(double x) {
return x * x;
}
struct Circle {
double x, y, r;
double dist(Circle c) {
return hypot(x - c.x, y - c.y);
}
bool Intersect(Circle c) {
return Sgn(c.r + r - dist(c)) > 0;
}
};
double Cross(Circle c1, Circle c2) {
return c1.x * c2.y - c2.x * c1.y;
}
double Dot(Circle c1, Circle c2) {
return c1.x * c2.x + c1.y * c2.y;
}
double Length(Circle c) {
return hypot(c.x, c.y);
}
double Angle(Circle c1, Circle c2) {
return acos(Dot(c1, c2) / Length(c1) / Length(c2));
}
Circle a[MAXN];
struct Edge {
int from, to;
double w;
Edge(int from = 0, int to = 0, double w = 0) : from(from), to(to), w(w) {}
}es[MAXN * MAXN];
double d[MAXN];
int n, cnt;
bool find_negative_loop() {
memset(d, 0, sizeof d);
for(int i = 0; i < n; i++) {
for(int j = 0; j < cnt; j++) {
Edge e = es[j];
if(Sgn(d[e.to] - d[e.from] - e.w) > 0) {
d[e.to] = d[e.from] + e.w;
if(i == n - 1) return true;
}
}
}
return false;
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
cnt = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%lf%lf%lf", &a[i].x, &a[i].y, &a[i].r);
}
Circle O;
scanf("%lf%lf%lf", &O.x, &O.y, &O.r);
for(int i = 0; i < n; i++) {
a[i].x -= O.x;
a[i].y -= O.y;
a[i].r += O.r;
}
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(a[i].Intersect(a[j])) {
Circle c1 = a[i], c2 = a[j];
double sgn = 1;
if(Cross(c1, c2) < 0) sgn = -1;
double ang = Angle(c1, c2);
es[cnt++] = Edge(i, j, sgn * ang);
es[cnt++] = Edge(j, i, sgn * -ang);
}
}
}
puts(!find_negative_loop() ? "YES" : "NO");
if(T) puts("");
}
return 0;
}
zoj2318的更多相关文章
- OJ题目分类
POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...
随机推荐
- [洛谷P1337][JSOI2004]平衡点 / 吊打XXX
题目大意:有$n$个重物,每个重物系在一条绳子上.所有绳子系在一起,问绳结最终平衡于何处. 题解:$NOIP$前学学模拟退火,但发现我脸好黑啊... 卡点:脸黑 C++ Code: #include ...
- Win7/8 绿色软件开机启动
在查找番茄工作法PC端软件时,发现了淡高的文章win8绿色软件开机启动,试用了一下wintabs,的确好用! 另外,office软件中有一款 OFFICE tabs的插件,标签式的管理,非常方便快捷, ...
- ()()()()x()=()()()()填1-9数字
/** Function: ()()()()x()=()()()() Developer: Date: */ #include "iostream" #include " ...
- [洛谷P3942] 将军令
洛谷题目链接:将军令 题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又 ...
- Python基础(6)_函数
一 为何要有函数? 不加区分地将所有功能的代码垒到一起,问题是: 代码可读性差 代码冗余 代码可扩展差 如何解决? 函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用 结论:函数使用必 ...
- [BZOJ1441&BZOJ2257&BZOJ2299]裴蜀定理
裴蜀定理 对于整系数方程ax+by=m,设d =(a,b) 方程有整数解当且仅当d|m 这个定理实际上在之前学习拓展欧几里得解不定方程的时候就已经运用到 拓展到多元的方程一样适用 BZOJ1441 给 ...
- 【LibreOJ】【LOJ】#6220. sum
[题意]对于n个数,找出一些数使得它们的和能被n整除,输出任意一组方案,n<=10^6. [算法]构造/结论 [题解]引用自:http://www.cnblogs.com/Sakits/p/74 ...
- swift中的尾随闭包的用法
尾随闭包就是这个函数的最后一个参数是一个闭包,所以规定这个闭包既可以写在函数的参数括号里面,也可以直接放在最后面来使用,就像重新给这个函数定义了一次一样,有些怪,不过用的时候,可以把闭包写在外面的.这 ...
- mysql 表的类型
MySQL 数据表主要支持六种类型 ,分别是:BDB.HEAP.ISAM.MERGE.MYISAM.InnoBDB. 这六种又分为两类,一类是”事务安全型”(transaction-safe),包括B ...
- linux软件管理(Vim编辑器使用) ——(七)
windows : .exe 安装 .卸载 安装: mysql.exe cc.exe 卸载 : 该软件唯一的标识 ,包名 alibaba android : *.apk 卸载 包 ...