【BZOJ 1043】【HNOI 2008】下落的圆盘 判断圆相交+线段覆盖

计算几何真的好暴力啊。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define max(a,b) (a) > (b) ? (a) : (b)
#define N 1003
using namespace std;
const double Pi = acos(-1);
inline int dcmp(double x) {return (fabs(x) < 1e-6) ? 0 : (x < 0 ? -1 : 1);}
inline double sqr(double x) {return x * x;}
struct Point {
	double x, y;
	Point(double _x = 0, double _y = 0) : x(_x), y(_y) {}
};
struct Rround {
	Point O; double R;
	Rround(Point _O = Point(0, 0), double _R = 0) : O(_O), R(_R) {}
};
Point operator - (Point a, Point b) {return Point(a.x - b.x, a.y - b.y);}
inline double dis(Rround a, Rround b) {return sqrt(sqr(a.O.x - b.O.x) + sqr(a.O.y - b.O.y));}
inline bool cover(Rround to, Rround now) {return to.R >= now.R + dis(to, now);}
struct Splay {
	double l, r;
	Splay(double _l = 0, double _r = 0) : l(_l), r(_r) {}
};

Splay s[N];
int n, top;
double ans = 0, tt, nxt;
Rround r[N];
bool pd;

inline void ins(Rround a, Rround b) {
	double d = dis(a, b), t, st, l;
	t = (sqr(a.R) - sqr(b.R) + sqr(d)) / (d + d);
	st = atan2((a.O.y - b.O.y), (a.O.x - b.O.x));
	//st = atan2((a.O.x - b.O.x), (a.O.y - b.O.y));
	l = acos(t / a.R);
	s[++top] = Splay(st - l, st + l);
}
inline bool cmp(Splay a, Splay b) {return a.l < b.l;}

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
		scanf("%lf%lf%lf", &r[i].R, &r[i].O.x, &r[i].O.y);

	for(int i = 1; i <= n; ++i) {
		pd = 0;
		for(int j = i + 1; j <= n; ++j)
			if (cover(r[j], r[i])) {
				pd = 1;
				break;
			}
		if (pd)
			continue;

		top = 0;
		for(int j = i + 1; j <= n; ++j)
			if (!cover(r[i], r[j]) && r[i].R + r[j].R >= dis(r[i], r[j]))
				ins(r[i], r[j]);

		for(int j = 1; j <= top; ++j) {
			if (s[j].l < 0) s[j].l += 2 * Pi;
			if (s[j].r < 0) s[j].r += 2 * Pi;
			if (s[j].l > s[j].r) {
				s[++top] = Splay(0, s[j].r);
				s[j].r = 2 * Pi;
			}
		}

		sort(s + 1, s + top + 1, cmp);

		tt = 0; nxt = 0;
		for(int j = 1; j <= top; ++j)
			if (s[j].l > nxt) {
				tt += s[j].l - nxt;
				nxt = s[j].r;
			} else
				nxt = max(nxt, s[j].r);
		tt += 2 * Pi - nxt;

		ans += tt * r[i].R;
	}

	printf("%.3lf\n",ans);
	return 0;
}

可惜一开始$π$设为$int$了查了$2h$的错QAQ

时间: 2024-12-21 21:47:18

【BZOJ 1043】【HNOI 2008】下落的圆盘 判断圆相交+线段覆盖的相关文章

BZOJ 1043 HAOI 2008 下落的圆盘 计算几何

题目大意:给出一些圆盘,他们按照时间顺序相互覆盖,问最后的到的图形的可见圆周的周长是多少. 前言:円盘反对!让我们一起团结起来!赶走円盘! 思路:对于每一个圆盘,只要扫描在它后面出现的圆与它交的部分的并,总周长-相交的并就是剩下能看见的圆周的长度,然后累加到答案中. 对于两个圆的交,我们可以用一个有序数对(x,y)以弧度为单位来表示,这样所有的xy都在0~2π区间之内.求角度就利用余弦定理,见下图: ∠EAC就是我们要求的角.由于我们知道|AE|和|EC|分别是两个圆的半径,|AC|是圆心的距离

[BZOJ 1008] [HNOI 2008] 越狱

1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5041  Solved: 2177[Submit][Status][Discuss] Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input 输入两个整数M,N.1<=M<=10^8,1<=N<=10

[BZOJ 1010][HNOI 2008] 玩具装箱toy

比较基础的斜率优化DP详见以下2篇博客 http://www.cnblogs.com/proverbs/archive/2012/10/06/2713109.html http://blog.163.com/myq_952/blog/static/863906320112711750378/ 主要总结斜率优化时的步骤 1.证明较优决策点对后续状态影响的持续性 2.求斜率方程:一般化为左边是J,K,右边是I的形式 3.规定队列的维护规则 4.看决策是否又单调性,没有的话有应该怎样维护 本题的代码

BZOJ 1009 HNOI 2008 GT考试 AC自动机+矩阵乘法

题目大意:给出一个不能出现的字符串,问长度为k的字符串有多少种. 思路:用给定串建立一个AC自动机(或者KMP随便了),然后跑矩阵乘法就行了. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int k,length,p; char s[MAX]; in

BZOJ 1004 HNOI 2008 Cards Burnside引理

题目大意:给出一个置换群,求有多少种本质不同的染色方案. 思路:Burnside引理:置换群的等价类数目=所有置换的不动点数目的平均值. 有了这个引理,我们只需要求出所有不动点的数目求一个平均值就可以的到等价类的数目了. 要使一种染色的方案在一种置换的意义下是不动点,需要让这个置换的每个循环节中的颜色都相同.先求出所有置换的循环,然后用一个背包就可以初解了.最后乘法逆元搞一下除法. CODE: #define _CRT_SECURE_NO_DEPRECATE #include <cstdio>

BZOJ 1007 HNOI 2008 水平可见直线 计算几何+栈

题目大意:给出一些笛卡尔系中的一些直线,问从(0,+∞)向下看时能看到哪些直线. 思路:半平面交可做,但是显然用不上.类似于求凸包的思想,维护一个栈.先将所有直线按照k值排序,然后挨个压进去,遇到有前一个交点被挡住的话就先弹栈. 比较闹心的是去重.我的方法是压栈之前先去重,然后在处理. CODE: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #includ

BZOJ 1009 HNOI 2008 GT考试 递推+矩乘

1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3679  Solved: 2254[Submit][Status][Discuss] Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2.

bzoj 1043 下落的圆盘 —— 求圆心角、圆周长

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 求出每个圆没被覆盖的长度即可: 特判包含和相离的情况,注意判包含时 i 包含 j 和 j 包含 i 是不同的情况: 然后考虑相交,可以算出被覆盖的那段圆弧所对的圆心角,用一个 [0,2π] 的角度区间维护没被覆盖的部分: 所求的角度是对于一条"基准线"而言的,所以首先要求出圆心连线对于"基准线"的角度,因为知道两个圆心,可以利用 atan2(y,x) 求

BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<