HDU3868 HASH 隨機增量

2021-05-27 08:27:13 字數 1730 閱讀 3342

求點集中兩兩之間距離之和最小的三個點

在使用增量法過程中,我們需要對於新加入的點是否能夠構成新的答案進行高效的判定。假設當前集合的答案為r,對於新加入的點,我們發現如果這個點能夠與原集合中另外兩點構成新的最近的三個點的話,那麼另外的兩個點與這個新加入的點的距離一定不超過r/2,證明如下:

假設當前新加入點為c,且c與之前集合中的點a和b構成了新的最近的三個點,如下圖所示,不妨設|ac|>= ans / 2,由於三角形兩邊之和大於第三邊,必有|ab|+ |bc| > |ac|,即 |ab|+ |bc| + |ac| > 2|ac| > ans,也就不可能成為新的答案。

這樣我們就可以確定,對於新加入集合的點pi而言,理論上我們只需要檢視以pi為圓心ans/2為半徑的圓內的點即可,但是這樣不太容易實現。我們考慮將整個平面劃分成變長為ans/2的正方形網格,這樣對於pi而言,我們只需要查詢pi所在網格以及周圍8個網格共計9個網格內的點即可。我們可以通過對於網格進行雜湊的方法來快速查詢這些點。由於隨著點的加入,ans越來越小,可以發現任意乙個網格中的點總數總是很有限個,這樣通過雜湊我們就可以再接近常數時間內判斷出新加入的點是否能夠產生更小的答案。但是這樣一來當新加入的點產生了新的答案時,ans發生變化,就要求我們對於更新網格,也就是更新雜湊表中的內容,需要o(n)的時間,這樣可以得到乙個時間複雜度為o(n^2)的增量演算法。

但是上述演算法仍然不能滿足時間要求。我們注意到更新網格不是總會發生,只是最壞情況演算法會到o(n^2)的時間複雜度,而實際發生的概率為9k/n,其中k是網格中的點的個數,n為當前集合總的點數,這樣我們就可以通過對於點的順序隨機洗牌,然後執行上述增量演算法,從而避免最壞情況的發生,也就是使用隨機增量法,得到乙個o(n)的演算法。

#include #include #include #include #include using namespace std;

const int maxn = 65536;

#define p 971

#define inf 1e20

struct point p[maxn];

struct hash hash[maxn];

int head[maxn],tot;

const int dx = ;

const int dy = ;

double ans;

int cur[maxn],cs;

inline double dis(const point &a,const point &b)

inline double cal(const point &a,const point &b,const point &c)

inline void sherwood(const int n)

}pair getgrid(const point &p)

inline int getkey(const pair&grid)

inline void init()

inline void insert(const int id)

inline void getpoint(const point &cp)

}}inline void rebuild(const int n)

}inline void solve(const int n)

}if(now < ans)else

}}int main()

solve(n);

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

} return 0;

}

HDU 4886 hash 暴力列舉

題意 給乙個主串s 只包括 a b c d e f g h 然後要找出乙個串ans 也只包括 a b c d e f g h ans滿足條件 在s所有子串中沒出現過,其次保證長度最短,最後保證字典序最小。思路 可以估計ans的長度最長為7,因為要使主串s中存在所有的8個字元的排列需要長度為8 7,已...

HDU 1430(康拓展開hash)

在魔方風靡全球之後不久,rubik先生發明了它的簡化版 魔板。魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1 8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示 從魔板的左上角開始,按順時針方向依次寫下各方塊的顏色代號,所得到的數字序列即可表示此時魔板的狀態。例如,序列 1,2,3...

前m大的數 hdu1280 hash

強大的hash 時間相差好多啊!include 2551148 2010 06 21 00 59 31 accepted 1280 15ms 288k 843 b c 悔惜晟 include using namespace std int hash 10001 int a 3005 int main...