原创 scu 4444 travel

鏈接 這道題目很新穎,但是不會做(:зゝ∠)。看了下叉姐的代碼,簡單易懂。 題目大意是給你n個點,我們知道最多存在n*(n-1)/2條邊,其中m條邊是題目給出的,經過它們需要花費的時間爲a,另外剩下的花費時間爲b(爲了方便,我們

原创 poj 3597

仍然是二分。 因爲N很大,我們無法直接算出吧所有的difference,然後求得其中的中位數,但是我們可以二分那個中位數mid,然後看對於數組中的每個數,值大於a[i]+mid的總的個數是否大於所有difference總數的一半

原创 poj1930

無限循環小數化分數的問題。 首先,題目的意思是後面的….可能重複任意的小數部分,所以我們得枚舉循環的部分。 結論是這樣的: 假設有個無限循環小數0.abcdefgh…..非0部分長度爲len 那麼我們令其非循環部分長度爲c

原创 poj2976

說說思路吧。 我們假設a[i]+a[i+1]+…a[k]/(b[i]+b[i+1]+…b[k])=ans,那麼得 (a[i]+a[i+1]+..a[k])-(b[i]+b[i+1]…+b[k]) *ans=0,題目要求的就是最

原创 poj 3421

題目給出一個X,求從1到X列出一串數字X0,X1,X2..Xm使得 X0=1,Xm=X,Xi < Xi+1 且Xi+1%Xi=0的m的最大值及方法數 此題本質是讓你求X的素數因子,然後進行組合。 比如我們有個100, 100=

原创 數學專題1

A:相當於已知 f[i] = 2*(f[i-1]+f[i-2]),然後求f(n),n大到2^60,所以我們無法用遞推,此時我們就用矩陣快速冪。 #include<stdio.h> #include<iostream> #inclu

原创 poj 2236

並查集應用的簡單題。對於每一個修好的電腦,我們遍歷所有已經修好的電腦,如果它們之間的距離小於等於d,那麼我們就將兩個集合合併到一起,在詢問是否能夠互通時,就看它們是否屬於同一個集合,但是我們不能寫成fa[x] == fa[y],而

原创 AOJ 2249

優先隊列+Dijkstra 因爲題目中所給的點的個數多達10000個,而且看得出來要求最短路,但是普通的Dijkstra的效率爲O(n^2),這顯然是不行的,那麼我們可以用優先隊列+DIjkstra。題目中說了,要求去掉一些邊,

原创 poj 1330

LCA裸題。 這裏我用tarjan(dfs+並查集)的方法進行離線處理。 這是第一個例子的圖,題目中求的是16和7的LCA,那麼這個過程是這樣的。 我們從根節點,即8號開始搜索,每次計算完LCA(u)以後,那麼我們就處理

原创 poj3685

二分套二分。 我們首先二分第m大的數是多少,二分出來以後,我們去判斷整個N*N的矩陣裏面小於它的數有多少個。通過觀察i*i + 100000 * i + j*j - 100000 * j + i * j 這個式子,我們可以發現,

原创 scu 4438 Censor

之前做過類似的題目,不過因爲匹配串長度較短,所以都是直接模擬的,而此題字符串的長度比較長,所以我們得用KMP。 先用KMP得到匹配串w的next數組,然後匹配兩個串,邊匹配邊用棧模擬,棧維護主串每次匹配到匹配串的哪個位置,然後如

原创 poj 3273

剛開始沒有注意到 每個月都得在一組裏面,即當a[i]>當前的最大值時,是不符合條件的。 答案的話明顯用二分,二分那個最大花費就行。 #include<stdio.h> #include<iostream> #include<st

原创 poj 3111

這道題目跟2976差不多,也是二分那個最大的值,然後化成計算式,排序以後得到一個數組,取最大的前k個,然後記錄結果,繼續二分即可。 #include<stdio.h> #include<iostream> #include<str

原创 CF #324 (Div. 2)

A:因爲t只有2到10的範圍,所以直接在最前面寫上一個t,然後後面補齊0就可以了。當然,t=10的時候要注意一下。 #include<stdio.h> #include<iostream> #include<string> #in

原创 Aoj 2170

簡單的並查集應用。 不過注意,我們平常用的路徑壓縮在這裏就不能用了,因爲我們並不更新路上的所有結點到同一個並查集中去,這裏只是做查詢的用途。 題目中當mark一個點時,我們就用fa[x]=x去更新某個點,使它作爲一個並查集的根