计算几何
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
poj2588 snakes (并查集判断连通性+几何)
最重要的写在最前面:这题要用c++编译器才能过!!!默认的G++过不了!!!坑害多少生灵,╭(╯^╰)╮ 首先要发现,如果上下边界联通则一定过不去。我们把上边界叫做0,下边界叫做n+1,与他们相交的合并进一个集合,两圆相交的也合并进一个集合。看上下边界是否在同一个集合里即可判断能否通过。然后是找最大值的问题。先看起点的最大值,什么样的圆才会影响我们的起点最大值呢?至少,这个圆要与起点线(即左边界)原创 2017-09-04 14:26:06 · 624 阅读 · 0 评论 -
bzoj2739 最远点(凸包+决策单调性+分治)
给定一个凸包,询问每个点距离最远的点的标号。 我们按逆时针考虑每一个点i,距离i最远的点j也是在逆时针转的。 因此我们可以把这个凸包拆成链,(把点再复制一次),每个点i合法的点的区间为[i,i+n]。其余点到i的距离为-inf。这样我们就有决策单调性了,随着i的增大j也是单增的。因此我们可以直接分治求。复杂度O(nlogn)O(nlogn)O(nlogn)#include <bits...原创 2018-07-02 23:05:53 · 718 阅读 · 0 评论 -
bzoj1670 [Usaco2006 Oct]Building the Moat(凸包)
求凸包裸题。用的是Graham扫描法求凸包。 a×b>0a×b>0a\times b>0 说明向量b在向量a的逆时针方向上。 我们一开始极角排序就是要把这些点与点1的连线逆时针排序。 然后按顺序处理这些点,维护一个栈,使得相邻点之间的线段都是逆时针转的。这样就得到了一个凸包。 写个模板题还被卡精度了gg 要1e-6…#include <bits/stdc++.h>...原创 2018-06-26 21:14:38 · 258 阅读 · 0 评论 -
bzoj2300 [HAOI2011]防线修建(动态维护凸包)
把操作离线,倒着做,这样就是加点维护凸包了。 可以用set维护一下当前凸包上的点 然后每次新加一个点时判断是在凸包内还是凸包外 如果在凸包外,就要重新维护上凸壳,往两边删点,直到再次构成凸壳。 O(nlogn)O(nlogn)O(nlogn)#include <bits/stdc++.h>using namespace std;#define ll long long...原创 2018-07-01 22:37:43 · 370 阅读 · 0 评论 -
bzoj3007 拯救小云公主(二分答案+并查集)
二分答案以后就是不能经过若干圆,能否从(1,1)走到(n,m) 只要(1,m),(n,1)不连通即可。 并查集维护一波即可。 复杂度O(n2logw)O(n2logw)O(n^2logw)#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define ll long long#defi...原创 2018-06-13 23:05:39 · 657 阅读 · 0 评论 -
bzoj3630 [JLOI2014]镜面通道(计算几何+最小割)
首先你要知道这样一个物理学结论:【水能流过的地方,光也能经过】 于是乎只要左右连通就可以了。 对偶一下,就是只要上下界不要连通就可以了。 于是建图最小割,把每个点拆点,i->i+n,1 如果与上界有交就连边S->i,inf 如果与下界有交就连边i+n->T,inf 如果i,j相交了就互相连边。 然后此题毒瘤的地方就在于各种判交… 你需要耐心… 数据比较友好,没有...原创 2018-06-13 22:39:04 · 224 阅读 · 0 评论 -
bzoj1007 [HNOI2008]水平可见直线(单调栈+维护下凸壳)
我们发现最终可见直线一定是构成了一个下凸壳,因此我们可以按k从小到大排序,用单调栈维护一个下凸壳。 注意斜率相等的直线,我们肯定是取b最大的那条。原创 2018-03-28 09:47:38 · 508 阅读 · 0 评论 -
bzoj1027 [JSOI2007]合金(计算几何+Floyd)
因为a+b+c=1,所以可以只看前两维,忽略第三维。 把每种合金看做一个二维平面上的点,我们可以证明两种合金的连线上的合金都可以由这两种合成出来。进而我们可以发现,选择的原材料合金围成的凸包中的点我们都可以合成出来。因而问题就转化为:在点集A中选择一个子集S,使得点集B中的所有点都处于子集S围成的凸包中,最小化子集S的大小。我们可以利用floyd求最小环来解决:枚举点集A中的任意两点i,j(i可以原创 2018-03-31 11:44:05 · 246 阅读 · 0 评论 -
bzoj2395 [Balkan2011]Timeismoney(Kruskal+计算几何)
最小乘积生成树。我们把每棵生成树看做二维平面上的一个点(x,y),x坐标为边权1的和,y坐标为边权2的和。那么我们就是试图找到一个点,使得过它的双曲线最靠近坐标轴。我们不难证明,这样的点一定是在下凸壳上的。于是我们现在就是要找出所有在下凸壳上的点,用他们的x*y来更新答案。我们先找出最接近x轴和最接近y轴的两个点A,B(即一维上的MST),然后考虑在AB靠近原点一侧找一点C,使得离AB最远,即最大化原创 2018-03-30 10:08:00 · 232 阅读 · 0 评论 -
Codeforces Good Bye 2017
CF908A New Year and Counting Cards(模拟)CF908B New Year and Buggy Bot(枚举+模拟)CF908C New Year and Curling(几何+枚举)CF908D New Year and Arbitrary Arrangement(期望dp+数学)原创 2017-12-30 14:23:21 · 391 阅读 · 0 评论 -
bzoj2961 共点圆(cdq分治维护凸包,计算几何)
这题真是写的我有点绝望。菜不禁声。其实一开始是想拿KD tree树写的,听说能过,但是wa成狗??至今改不对gg。一个点(x0,y0)在圆(x,y)内,要求 (x−x0)2+(y−y0)2<=x2+y2(x-x_0)^2+(y-y_0)^2<=x^2+y^2 化简一下就是 x20+y20<=2x0x+2y0yx_0^2+y_0^2<=2x_0x+2y_0y 假设y0>0y_0>0,我们有y>原创 2018-01-15 10:30:14 · 890 阅读 · 1 评论 -
bzoj1822 [JSOI2010]Frozen Nova 冷冻波(计算几何+二分答案+最大流)
白天写的心不在焉的…一堆奇怪的错误。写个规范点的果然就好多了qaq首先就是巫师向他能吃到的小精灵建边,小精灵向汇建边,容量均为1.然后二分时间,算出每个巫师能吃几个精灵,由源向巫师建边,容量为算出的该巫师能吃几个精灵。如果小精灵都被吃了则合法。 然后对于一个巫师能否吃到一个小精灵,相当于我们要判断一条线段是否与给定圆相交。注意是线段!所以可能垂线段不是最小距离!需要判断一下垂线段是否与线段相交,如原创 2018-01-02 15:15:09 · 368 阅读 · 0 评论 -
NOIP模拟10.26
Poetize11 A.rainbow. 挂精度了。30。思路好像也有点问题·。。。正解是二分答案,通过勾股定理求出每个半圆能够覆盖的线段。此时问题转化为线段覆盖问题,排序扫描一遍即可。(直接拿圆判可能会有特例?) B.clover。状压dp+dfs瞎搞。。70. C.fin。dp打表了AC hh。实质上可以根据这道题的特性,把dp优化下,简直黑科技。处理出深度为d时,可能的最大节点数和最小节原创 2017-10-26 16:28:31 · 369 阅读 · 0 评论 -
poj1556 The Doors(建图spfa+判断线段交)
我们把起点和终点,还有所有的线段端点连起来跑最短路即可。两点之间连线段时要判断是否合法,即是否与之间的墙相交。怎么判断呢,直接算斜率什么的会有很大的误差,还可能出现除0的情况很讨厌,因此百度一下向量叉积判断线段相交。看得我都晕了。嗯。下次看到大概还是不会。原创 2017-09-26 21:38:55 · 383 阅读 · 0 评论 -
Codeforces Round #432
CF851A Arpa and a research in Mexican wave(水题)CF851B Arpa and an exam about geometry(几何)CF850A Five Dimensional Points(数学)原创 2017-09-05 10:50:50 · 367 阅读 · 0 评论 -
poj2318 TOYS(计算几何)
那些年不想写的计算几何,总有一天要还。直接枚举点,枚举四边形即可,只要用叉乘判断点是否在两条线段中间即可。O(nm)O(nm)O(nm)#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <vector>using n...原创 2019-06-28 17:23:38 · 356 阅读 · 0 评论