05 2013 档案
poj 2318 TOYS (几何+二分)
摘要:2318 -- TOYS 在别人的几何练习中找出来的简单的几何加二分的题目。题意是,给出隔槽的构造,统计出给出的点在哪一个隔槽中,最后将所有的统计结果输出来。 主要是不能用cin cout输入输出大量数据。这里用double也不会超时,不过用int会快很多。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <cmath> 5 #include <iostream> 6 #include <algorithm> 7 8
阅读全文
uva 10347 Medians (Simple Geometry)
摘要:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1288 给出三条中线的长度,求三角形的面积。 套公式可以过,不过我不明白为什么我求出三条边以后再判断是否能构成合法的三角形是错的。AC的代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <cm
阅读全文
POJ 2164 && LA 3218 Find the Border (Geometry, PSLG 平面直线图)
摘要:2164 -- Find the Border 卡了一个月啊,都快想放弃了。今天看了一下LRJ的PSLG版的代码,才想起来我的模拟捆包裹法存在的漏洞。那就是对点的坐标进行排序的时候,应该用的sgn()函数来进行比较,而不是我一开始的直接对浮点数进行比较。如果直接对浮点数进行比较,本来距离差不多的点就会被拉伸开来,导致应该是相邻点的点被分隔了。 做法比较简单,我的捆包裹法是先将所有的交点离散出来,然后处理出所有的相邻的点。最后,就是模拟向顺时针转动最多的方向的相邻点移动的所有过程。代码如下: 1 #include <cstdio> 2 #include <cstring>
阅读全文
LightOJ 1203 Guarding Bananas (Convex Hull)
摘要:Jan's LightOJ :: Problem 1203 - Guarding Bananas 简单凸包。处理凸包的时候吧ch写成了pt,wa了两次。 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 7 using namespace std; 8 9 struct Point {10 double x, y;11 Point() {}12 Point(doub
阅读全文
LightOJ 1239 Convex Fence (Convex Hull)
摘要:Jan's LightOJ :: Problem 1239 - Convex Fence 简单凸包,练手题。 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <cmath> 6 #include <iostream> 7 8 using namespace std; 9 10 typedef long long LL;11 12 struct Point {13 LL x
阅读全文
hdu 1140 War on Weather (3D-Geometry)
摘要:Problem - 1140 简单的三维几何题,对于每一个点,搜索是否存在卫星直接可见,也就是直线与球体是否交于较近的点。其中,套用的主要是直线与平面交点的函数。模板以及代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <set> 5 #include <vector> 6 #include <iostream> 7 #include <algorithm> 8 9 using namespace std; 10
阅读全文
hdu 1154 Cutting a Polygon (Simple Geometry)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1154 简单的计算几何题。因为没有看清题意,把直线看成线段了,所以WA了几次。 做法相当简单,我们只需要把直线于多边形的交点都求出来,然后每相邻两个交点取其中点,判断中点是否在多边形内。如果中点在多边形内,则当前线段在多边形内。这是一个很常见的判断方法。代码(带模板)如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <set> 5 #include <vec
阅读全文
LightOJ 1378 The Falling Circle (Basic Geometry)
摘要:http://www.lightoj.com/volume_showproblem.php?problem=1378 简单的计算几何,不过做这题要看清楚题目要求,对于自由下落的部分是求直线距离即可,可是对于在斜面上的运动,速度是多少就必须留意了。卡了一个晚上,出了好几组数据,结果就只是卡在没有看清楚题意上面。早上用手机提交,通过!带有几何模板以及部分debug的代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <set> 5 #include &l
阅读全文
hdu 2823 The widest road (Convex Hull)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2823 应该是经典的凸包间最短距离的题目吧。印象中是用旋转卡壳来过的,不过我在hdu水了一下,一个暴力O(n^2)算法直接撸过。 我的做法很简单,就是先判断两个凸包是否相交或包含,然后就用点到线段距离枚举凸包间距离,加了一个遇到距离增加的时候剪枝就过了。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <vector> 5 #include <algor
阅读全文
hdu 1348 Wall (Convex Hull)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1348 简单二维凸包,直接套用andrew算法得到凸包后求周长,然后加上一个圆周即可。 做的过程中有一个小错误,就是之前已经cin >> n;了,做凸包的时候写成了int n = andrew(pt, n, ch); 从而导致segment fault。以后要注意避免这样的事再次发生。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <vector>
阅读全文
hdu 1392 Surround the Trees (Convex Hull + Trick)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1392 模板题,套二维凸包,然后计算凸包周长。 唯一要注意的是两个点的时候,不用两点距离的两倍。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <set> 5 #include <iostream> 6 #include <algorithm> 7 #include <vector> 8 9 using namespace
阅读全文
hdu 1007 Quoit Design (Nearest Point Pair)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1007 最近点对。 做法是先对所有点先按x再按y排序,然后进行分治搜索最近点对。对于每个区间,如果点数小于3,就直接暴力搜索最近点,否则对其进行分治。分治出来的两个区间,我们要挑选出与中点距离小于已找到的最近距离的所有点,然后对他们进行暴力枚举最近距离。根据《算法导论》证明的,合并两个区间之后,被挑选出来的点不会超过6个,于是可以得到总的时间复杂度是O(nlogn)。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 7...
阅读全文
hdu 2604 Queuing (Matrix)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2604 题意是找出长度为n的,不包含“fmf”或“fff”的字符串的个数。 这题我是直接套用之前的ac自动机的模板的,构造出自动机,然后利用矩阵快速幂求出结果。当然,这题可以直接推出递推公式,然后再套入矩阵中。复杂度O(m^2 log n),其中m是矩阵大小,n是要求计算的长度。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5
阅读全文
hdu 2966 In case of failure (KD-Tree)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2966 一道KD树的题。题意是,给出n个不重合的点,求出这n个点的最邻近点的距离的平方。 什么是KE树就不介绍了,网上有许多KD的资料,做这题前先阅读材料。我的方法参考的是http://blog.csdn.net/zhjchengfeng5/article/details/7855241这个博客的代码,划分的过程直接调用STL中的nth_element,从而减少代码量。 我的做法是直接用点集数组构建线性存储的一棵KD树,然后用类似于线段树操作对点集进行划分和查找。因为题目的特殊性,于是我们可以将查找的时...
阅读全文
hdu 4562 守护雅典娜 (Simple Geometry + dp)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4562 中文题。 这道题的做法是先筛选出那些能够起到分隔雅典娜和怪兽的圆,就是那些只包围雅典娜或者只包围怪兽的圆,这样就分离出两种圆。因为不能同时对这两种圆进行dp,所以我们可以分别dp出最优解之后再对两种圆的最优解进行合并。这种dp就像是LIS,我们需要先对圆的大小进行排序,保证的是大的圆围在小的圆外面,这样就可以避免判断当前圆是否跟那个圆集里任何一个圆相交。代码如下: 1 #include <cstdio> 2 #include <iostream> 3 #include <
阅读全文
hdu 2586 How far away ? (LCA)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意是给出一棵树,求两点之间的距离。 经典LCA的题,在hdu那里无意中看到的。做法是dfs出一个先根遍历的路径,然后对路径求RMQ,当然,也可以用线段树维护。之后就是对每个询问输出dis[u]+dis[v]-dis[lca(u,v)]*2的值即可。代码如下: 1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 3 #include <cstdio> 4 #include <cstring>
阅读全文
hdu 1677 Nested Dolls (Greedy + Treap)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1677 题意是,给出一些矩形的长和宽,如果l1<l2且w1<w2,那么矩形2可以套在矩形1外面。问最优的套法下,最后可以剩下多少个矩形。 我想到的一个做法是,利用Treap来对当前最外层矩形是哪些进行维护。首先我们先按照宽(第二关键字)递增排序,如果相同就按长(第一关键字)递增排序。然后在构建出一棵空的Treap,按顺序插入到树中去。对于每一次插入,找到最大的可以被当前矩形覆盖的一个矩形,然后更新成新的矩形。如果找不到这样的矩形,就直接插入当前矩形。最后Treap的大小就是所需的答案。代码如下:
阅读全文
hdu 1224 Free DIY Tour (DAG 最长路)
摘要:Problem - 1224 水题一枚。 题目的意思是给出一个DAG,找出一条回路,路径的权值的和最大,输出最大值以及其路径。 构出DAG以后,spfa求最长路。代目如下: 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <vector> 5 #include <queue> 6 7 using namespace std; 8 9 typedef vector<int> VI;10 const int N = 111;
阅读全文
hdu 1069 Monkey and Banana (LIS)
摘要:Problem - 1069 随便找到的一道题目。 题意是给出一些的长方体,长方体可以用任意次数,可以任意翻转。如果一个长方体可以叠在另一个长方体上,条件是这个长方体的长和宽严格小于另一个长方体的长和宽。问给出的n种长方体最高可以叠到多高。 因为长方体有三种不同的面,而且长方体的长和宽要严格小于前一个,所以可以将一个长方体拆成三种不同的面作为底面的长方体,而且假设长总是大于宽的。将长方体按照长和宽排序,然后假设len[i]是放置第i个长方体的时候能得到的最大高度,之后的做法基本上跟LIS的操作一样了。 代码如下: 1 #include <cstdio> 2 #include <
阅读全文
uva 12553 Countdown (搜索+剪枝)
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3998 组队训练时候的一道题。题意是用给出的6个数利用加减乘除求出一个最接近给定数字的数,输出解决方案。 直接用状态压缩的方法,利用集合并,在两集合得出的数值之间加入运算符,存到新的集合之中去。如果不加入剪枝,总的状态数多达50W个,STL的常数大,所以会直接超时了。然后我们可以加上这样的一个剪枝,对于同一个状态,插入的数不应该重复,因为这样的一个数我们只需要一种获取方式就够了。于
阅读全文
hdu 3564 Another LIS (Splay Tree OR Segment Tree)
摘要:Problem - 3564 好不容易看见一道可以用Splay Tree写的题,结果应该是常数过大超时了。 好不容易还是给我找到bug了,就是一个字母打错,导致超时了。splay tree可以以421ms的时间完美通过。做法就是模拟插入数字,维护区间的最大LIS值即可。Splay版代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 6 using namespace std; 7 8 const int inf =
阅读全文
hdu 4546 比赛难度 (PFS,优先级优先搜索)
摘要:Problem - 4546 题目是中文的,不解释了。 开始的时候不知道怎么可以搞出答案,就觉得这个是需要搜索的。于是就想到逐个数加上去,然后只取前m小的和,其余的弹出集合这种方法。为了可以动态维护这前m个最小的和,我用了multiset,又为了不会搜索到超出内存什么的,所以我在搜索的时候采取了剪枝,如果求和得到的数比现在集合中最大的数还要大,当前和跟之后的所有数的和都会大于集合中的最大数,这时就不用继续搜索下去了。(原始单个数的结合已进行排序)代码如下: 1 #include <cstdio> 2 #include <iostream> 3 #include <
阅读全文
三种素数筛法汇总
摘要:本地测试结果是,第三种方法速度最快,而且可以直接判断给定的数是否素数。 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 7 using namespace std; 8 9 const int N = 111111111;10 int prm[6666666], pn, np[N >> 6];11 bool mp[N];12 13 void getPrm1()
阅读全文
poj 2362 Square (dfs+剪枝)
摘要:2362 -- Square 跟1011的Sticks差不多,不过这里是问给出的长度能否拼成一个正方形。这题数据比较小,不过对剪枝的要求还是差不多的。主要的剪枝是:1.由大到小排序后,在拼当前边的第一条棍子的时候必须选用当前没有用过的棍子中最长那条2.在搞同一条边的时候,下一条棍子不会比之前选了的大3.同一长度的棍子只搜一次然后就是代码: 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 6 using namespace
阅读全文
LA 2797 Monster Trap (Simple Geometry && Floyd)
摘要:ACM-ICPC Live Archive 这题十分有意思。简单描述题意,有一个巫师想抓一只怪物,于是就画出n条线段来围住怪物。问题是,巫师画出来的图形是否围住了怪物。 这题的做法是构建一幅图,无向图中的点就是线段的两个端点和怪物所在的位置点,以及一个无穷远点。然后要做的就是判断点与点之间是否直线相连。最后的到点与点间的关系,用floyd直接得到点与点间的可达关系。 其中,要注意的是,线段的头尾于另一线段重合了的情况,以及两线段交于用一个点的情况。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #inc
阅读全文
LA 4992 Jungle Outpost (二分+半平面交)
摘要:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2993 题意是,以顺时针方向给出一个多边形,可以任意的删除上面k个点,求最大的k,使得多边形内不存在任意点,无论删除哪k个点都依然保留在新多边形内。 二分加上半平面交。因为可以证明出,如果要删除k个点,最优的删除方法是删除连续的k个点,从而利用每隔d个点连出一条有向直线,判断新的半平面交是否为空。找到最小的,使半平面交为空的k,即为答案。1y~代码如下:View C
阅读全文
LA 2218 Triathlon (Geometry, Half Plane Intersection)
摘要:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=219 题意是,给出铁人三项运动员在每一项中的速度,问他是否有可能获得第一。 如果还没学过半平面交,估计做这题的时候应该是不停yy如何比较每两个运动员之间谁赢谁输,然后忽略了整体情况而导致狂wa不止。 如果是利用半平面交,这时我们要假设前两项项目的路程占全程分别是x和y,那么总时间T(x,y)=x/v+y/u+(1-x-y)/w。 对于判断当前运动员i是否能获胜,将它
阅读全文
poj 3525 Most Distant Point from the Sea (DC2 + Half Plane)
摘要:http://poj.org/problem?id=3525https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=1891&mosmsg=Submission+received+with+ID+1236113 一直不会半平面交,今天看了半平面交的做法,发现半平面交需要注意的细节还真是太多了,要仔细分析才能写对代码。半平面交较快的做法是用双向队列来维护半平面区域中的点和有向直线。 这道题
阅读全文
LA 4728 Squares (二维凸包+旋转卡壳)
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4199https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=2729&mosmsg=Submission+received+with+ID+1236098 依然是《训练指南
阅读全文
uva 10256 The Great Divide (Convex Hull, Simple)
摘要:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=show_problem&problem=1197 题意是给出两堆点,问是否能找到一条直线将这两堆点分开,有就输出“Yes”,否则输出“No”。 构建两个凸包,如果存在这样的一条直线,那么这两个凸包必然不相交。构建完凸包以后,就是枚举每条边,判断两个凸包是否有相交的部分。代码如下:View Code 1 #include <cstdio> 2 #include <cstrin
阅读全文
poj 3134 && LA 3621 Power Calculus (迭代加深深度优先搜索)
摘要:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=16223134 -- Power Calculus 又搞了几天才出一题。 这题我是用迭代加深深度优先搜索来做的。网上的题解多种多样,大部分都是BFS的,不过好多都是没有证明的方法。表示个人认为迭代加深是一个十分好的正解。 至于这题为何用迭代加深,个人认为原因是:(1)BFS剪枝不容易加上去,即便是加上一两个剪枝也无法剪枝到系统可以接受的时间和空间。(网上有题解说搜索
阅读全文
poj 2743 && LA 3403 Mobile Computing (mid-easy Search)
摘要:2743 -- Mobile Computinghttps://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1404 中等偏简单的一道搜索题,用状态压缩可以直接计算出来。因为mobile的一条rod只有两端,所以我们只要考虑两边分别是放置哪个/哪些重物就可以了。这个可以用集合的形式来表示,然后就是一个子集分割,但是这里不允许空集,所以初始集合有所不同。sample真实神奇,我的mobile的力矩公式都用反了居然还可以过了sam
阅读全文
uva 10652 Board Wrapping (Convex Hull, Easy)
摘要:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1593 要做的操作是将矩形的四个顶点拿出来,然后对点集构建凸包。简单题,1y!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <set> 5 #include <vector> 6 #include <iostream
阅读全文
LA 2572 Viva Confetti (Geometry.Circle)
摘要:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=problem_stats&problemid=573&category= 一道很好的几何题。要求是给出一些圆,按顺序覆盖上去,问哪些圆是可以被看见的。 看刘汝佳的书,开始的时候不明白“每个可见部分都是由一些‘小圆弧’围城的”这样又怎么样,直到我看了他的代码以后才懂。其实意思就是,因为每个可见部分都是由小圆弧围成,所以,如果我们将小圆弧中点(不会是圆与圆的交点)相对于弧的位置向里或向外稍微移动一下,然
阅读全文
poj 1041 John's trip (Euler Circuit)
摘要:1041 -- John's trip 输出字典序最小的欧拉回路。之前做过的是要求点的序列最小字典序,今天见到这个经典的欧拉回路是要输出边的编号的最小序。做法跟输出点路径的相似。View Code 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <set> 5 #include <map> 6 #include <queue> 7 #include <stack> 8 9 using namespac
阅读全文
hdu 2454 Degree Sequence of Graph G
摘要:Problem - 2454 模拟,利用图的性质,将当前度数最大的点(假设度数为d(x))删除的同时,把紧接着的前d(x)大的度数分别减一。如果最终可以全部相消,那么就是一个简单图,否则不是。View Code 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <set> 5 #include <stack> 6 7 #define REP(i, n) for (int i = 0; i < (n); i++) 8 using
阅读全文
浙公网安备 33010602011771号