Time of Update: 2018-12-07
POJ_2991 如果我們將其中某一個線段旋轉β角,那麼這個線段上方的所有線段都會旋轉β角,這就很類似線段樹中的對區間加上一個常數的問題了,於是不妨向著線段樹的思路去想。
Time of Update: 2018-12-07
HDU_3954 一開始始終在糾結要怎樣維護max,因為不同等級的人每次加的經驗是不一樣的,這樣如果只用一個max來維護最大值的話是很難辦的。看了胡浩的出題報告之後恍然大悟,既然一個max來維護是很難辦的,那不妨就將max變成K個,max[i]表示等級為i的人的經驗的最大值,這樣max[i]的增加就很好處理了。
Time of Update: 2018-12-07
Time of Update: 2018-12-07
WHU_1124 首先對於有N參加的比賽,肯定是贏了最好,暫時先不考慮其他的比賽,這是如果各隊的積分有大於或等於第N隊的,那麼肯定是輸出NO的。
Time of Update: 2018-12-07
POJ_3368 本來想找個RMQ問題練一下今天剛學的ST演算法,結果這個題我用ST做不出來,所以只好又用回線段樹解法了。 當然dicuss裡面有人說也可用ST去做的,我就只說一下我用線段樹去做的思路吧。
Time of Update: 2018-12-07
POJ_1106 首先,我們可以把圓以外的點去掉。 之後,一開始想到的是枚舉直徑和x軸的夾角去算,但這樣精度不能保證,而且不好算,於是否決掉了。 後來想了一下,這個題目實際可以轉化成一個圓裡面有一些點,然後用一條直徑把圓切成兩半,這樣哪一半裡面的點多就取哪一半。同時不難想到,一定可以構造出這條直徑過某個點且切完之後可以得到最優解的情況,因為如果這條直徑不過任何一個點,我們就可以將其旋轉使其過某一點,同時這樣不會影響到解的最優性。
Time of Update: 2018-12-07
POJ_3384 題目的意思是說在多邊形內安排兩個圓,使得兩個圓覆蓋的地區儘可能大(重合的部分只算一次),求兩個圓的圓心座標。 首先,受POJ_3525這個題目的啟發,我們先將凸多邊形的邊都向內收縮R,這樣得到了一個新的凸多邊形(新凸多邊形的各個頂點可以通過求半平面交得到),那麼兩個圓的圓心必定在這個新凸多邊形中,否則就會和原來的凸多邊形的某條邊相交。
Time of Update: 2018-12-07
HDU_2492 由於N比較大,枚舉兩個隊員並計算其中有多少個裁判是行不通的,不妨換一種思路去枚舉裁判,這樣對於任意一個裁判而言,不同的比賽場數等於左邊小於裁判skill rank的人數乘以右邊大於裁判skill rank的人數,再加上右邊小於裁判skill rank的人數乘以左邊大於裁判skill rank的人數。 在計算人數的時候,可以維護記錄分別記錄左右兩邊各個skill
Time of Update: 2018-12-07
POJ_3255 本來想做POJ_2449的,結果自己想的這個演算法TLE,看來解決那個題只能搞A*了。 這個題目由於求次短路,第K短路的K就是2,比較小,所以可以直接用純dij搞。我的思路就是把圖上每個點搞一個容量不小於K的最大堆和最小堆,最小堆用於取到達當前該節點的第某短路值,最大堆用來儲存前K小的最短路。
Time of Update: 2018-12-07
HDU_3397 感覺這種維護序列的題目就是填代碼,把每種操作的模組寫好就OK了。更多和區間合并相關的問題可以參考胡浩的部落格http://www.notonlysuccess.com/index.php/segment-tree-complete/。 為了方便實現各種操作,可以引入lc[0/1](left contiguous)表示一個區間從左邊開始連續最長0/1是多少,rc[0/1](right contiguous)表示一個區間從右邊開始連續最長的區間0/1是多少,mc[0
Time of Update: 2018-12-07
HDU_1024 可以用f[i][j]表示掃描到第j個元素時且一共選i個區間的最優解,這樣可以得到f[i][j]=max{f[i][j-1],f[i-1][k]+A[j]-A[k]}(i-1<=k<j),其中A[]表示首碼和。 如果不加最佳化的話是O(MN^2)的演算法,但實際上我們可以在遞推的過程中維護x=f[i-1][k]-A[k]的最大值,那麼動態轉移方程就改寫成了f[i][j]=max{f[i][j-1],x+A[j]},這樣就是O(MN)的複雜度。 此外,
Time of Update: 2018-12-07
HDU_1171 這個題目可以用產生函數的思路去做,也可以用多重背包的思路去做,而且用多重背包的思路做時可以參考《背包九講》裡面的二進位最佳化多重背包問題那一塊,這樣做效率更高。 另外多重背包問題用單調隊列最佳化之後還可以達到O(VN)的效果,我暫時還沒有學,所以就唯寫了這個二進位最佳化的版本。//產生函數#include<stdio.h>#include<string.h>#define MAXD 60#define MAXM 130000int N, S,
Time of Update: 2018-12-07
POJ_2892 這個題目用splay去想還是比較直接的,但之所以感覺思路比較直接,也是因為前面又鞏固、學習了一下線段樹的一些對於區間合并的操作,更多的涉及線段樹區間合并的題目可以參考胡浩的部落格http://www.notonlysuccess.com/index.php/segment-tree-complete/。
Time of Update: 2018-12-07
HNU_10694 這個題目本質上就是去求模p的原根。 首先,我們用反證法證明這個結論:如果對於任意的正整數i,r^i%p包含了1~p-1所有整數的話,那麼滿足r^i%p=1這個等式的最小正整數為p-1。 如果上面的命題不成立,不妨設滿足r^i
Time of Update: 2018-12-07
SGU_225由於在dp的時候需要記錄上面兩行放置馬的狀態,以及馬的數量,這樣狀態數就相當多了,直接交寫完的dp就TLE了。暫時沒有想到好的辦法,所以拿自己dp的程式打了個表交上去AC了。// 注意:這個程式是用來打表的,並不是可以直接提交的程式。#include<stdio.h>#include<string.h>#define MAXD 20#define HASH 100007#define SIZE 2000010int N, K, ucode[MAXD],
Time of Update: 2018-12-07
SGU_114 這個題目乍看起來沒什麼思路,但如果隨便挑一個點作為station,然後分別左右移動一下看看移動之後能夠減少多少不滿同時又會增加多少不滿,思路便瞬間有了。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 15010int N, x[MAXD], p[MAXD], r[MAXD];long long int A[MAXD];int cmp(const void
Time of Update: 2018-12-07
一開始反應的是用狀態壓縮dp來做,後來一看步數很小,只有三步,於是直接暴力就可以了。另外由於測試資料比較多,可以先從最終狀態BFS一遍,保留下所有結果,然後每次判斷就是O(1)的了。#include<stdio.h>#include<string.h>#define MAXD 20#define MAXM 160#define MAXS 100010#define INF 0x3f3f3f3fint first[MAXD], e, dis[MAXS], next[
Time of Update: 2018-12-07
HDU_1941 這個題目說白了就是要刪掉一些點,而且被刪掉的點兩兩之間不能有邊,留下的點兩兩之間必須有邊,也就是構成一個完全圖。 乍看起來是沒啥思路的,不過大概有兩條路子可以走,要麼先考慮什麼樣的點一定會留下來,要麼就先考慮什麼樣的點一定會被刪掉。想想之後覺得第二條路子還可行一些,於是就開始想吧。
Time of Update: 2018-12-07
POJ_1486 這個題目相當於判斷是否存在唯一的二分圖最大匹配的問題,只不過最後即便沒有唯一的二分圖最大匹配,也將已經匹配好的輸出即可。 在匹配的時候採用貪心的策略,如果當前有一個點只連了一條邊,那麼就一定可以唯一的確定出一個匹配,然後不停的這樣找直到找完這樣的點為止,剩下的如果還有點沒進行匹配,那麼剩下的點的匹配就不是唯一的了。#include<stdio.h>#include<string.h>#define MAXD 30int N, xM[MAXD]
Time of Update: 2018-12-07
UVA_11995 如果還可能是某個資料結構的話,就對其類比操作,知道出現錯誤為止。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1010int N, D, max[4 * MAXD], q[MAXD], s[MAXD];void init(){ for(D = 1; D < N + 2; D <<= 1); memset(max, 0,