摘要: 给出平面上的一些点,求覆盖这些点的最小圆。具体问题可以见hdu 2215。具体解法是,先求凸包,然后枚举凸包上任意3个点,若枚举的三个点构成钝角三角形,则最大半径为最长边的一半否则,半径r=a*b*c/(4*s)其中s是面积,具体面积可以用叉乘求得,s=(向量a叉乘向量b)的绝对值的一半。View Code 1 #include<iostream> 2 #include<string> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 7 struct node 8 阅读全文
posted @ 2012-10-09 19:30 Accept 阅读(679) 评论(0) 推荐(0) 编辑
摘要: a^b,假如a和b分别是10000000 10000000,我们知道计算机是无法存储这样大的数的。看来直接计算,然后取前N位和后N位,是不可能的了。先来看后N位如何计算,假设N==3。那么不管a实际上有多大,我们的计算结果实际上只和a的后3位有关,也就是说第四位开始对我们的答案是没有影响的,能理解么?所以我们先让a对1000取模,然后利用快速幂算法求出a^b次方,过程中别忘记了对1000取模。再来看前N位如何计算,同样假设N==3.假设a^b==c。那么我们对c取一个log10,得到d。d肯定是一个浮点数,我们先看d的整数部分,10^(d的整数部分)等于100000....(d个0),好了,注 阅读全文
posted @ 2012-10-09 13:03 Accept 阅读(1508) 评论(0) 推荐(1) 编辑
摘要: 题意:给你一个集合,集合里没有重复元素。集合可以添加元素,也可以删除元素(前提是集合里有),另外还有一个询问操作,问集合里最小的差值是多少(只有一个元素的时候询问无效)例如,集合开始的时候有1 7两个元素,那么最小差值就是6。当再添加一个新的元素3,集合就变成了1 3 7,那么最小差值就是2。解法:对于每一个区间线段,我们给它3个属性,最小值minf,最大值maxf,以及最小差值deff。从下而上,我们很容易可以看出,某一个线段 i 的最小值为min(left_child[i].minf,right_child[i].minf) 最大值... 阅读全文
posted @ 2012-10-09 12:24 Accept 阅读(806) 评论(0) 推荐(0) 编辑