聽說作TC題有助於提升知識水平? :)html
轉載請註明連接:http://www.cnblogs.com/Blog-of-Eden/p/8407296.htmlgit
當K*2<=N的時候,顯而易見的是編號爲i(K<=i<=N-K+1)的點必定會造成一條鏈。github
枚舉合法的這樣的鏈,剩下的暴力dp吧。算法
當K*2>N的時候,顯而易見的是編號爲i(N-K+1<=i<=K)的點必定會造成一個聯通快。數組
若是把這個聯通塊去掉,樹會造成若干個不相交、不接觸的小聯通塊,且這些聯通塊的大小之和必定。網絡
若是把樹的一個點提根,進行上下dp,就能很方便地進行統計答案。dom
好慘慘啊!這麼簡單的題居然沒有本身想出來~~學習
咱們稱棋子A和棋子B等價,當且僅當它們只會同時在這個棋盤上,或同時離開棋盤。優化
一個顯然的結論就是,若A和B等價,B和C等價,那麼A和C等價(即具備傳遞性)ui
因此能夠經過bfs求出全部等價點對,經過並查集合並。用總狀況數減去不合法狀況數就行了。
topcoder罕見的水題啊!
若是咱們已知了每一個數相與原數不一樣的最高的二進制位,(設ta爲pi)
那麼對於第k位,若是有x個數知足pi>k,因爲這些位的異或值肯定,
因此,當x>0時,有2^(x-1)種方案。
因爲當x=0時會有意想不到的事情發生,因此稍微dp一下就行了。
topcoder罕見的無思惟難度碼農題。。
分兩種狀況討論:A、B、C在同一條鏈上。以及A、B、C不在同一條鏈上。
http://www.cnblogs.com/Blog-of-Eden/p/7852426.html
一道很妙的題哇。
一個顯而易見的結論是,一座山的可見範圍,必定是一段連續的區間。
考慮編號從大到小的放置山。
若是當前山可見,而且可見範圍不是從最左邊到最右邊。
那麼又有一個很顯然的結論,當前山只有兩個合法位置。
考慮若是當前山不可見,那麼這座山對以後要放的山沒有絲毫影響。直接乘上這座山合法的位置數便可。
若是這座山處處均可見?這是個較嚴重的問題,
咱們考慮,把全部這樣的處處均可見的山所有拿出來。(按照編號從小到大)(咱們稱之爲大山)
相鄰兩座大山之間夾着若干個小山。
對於大山L和大山R,(L<R),很顯然1到L-1和R+1到n的山對這之間的山的放置沒有影響。
因此能夠枚舉相鄰兩個大山的位置,對之間的小山位置進行dfs。
dfs的複雜度是2的冪次,能夠接受。
異常興奮!又一道喜聞樂見的分狀況討論題!
咱們設有m對連線已經肯定。(m<=n)
當m比較大的時候,暴力彷佛行。O(2^(2n-2m-1)*C(2n-2m,n-m))
當m比較小的時候,枚舉這些連線分別在上方仍是在下方。
方案合法當且僅當這個半圓裏面與它同向的點的數量是偶數。
設向上爲1,向下爲0,一個半圓至關於限制了這個半圓之中的變量的xor值爲1或者是0.
對於前綴xor數組,至關於限制了兩個位置上的數xor爲1或者是0。
這個用並查集來檢查一下是否合法便可。
我真是個愛學習的孩子,在秋遊的時候還在想這道題~~
簡單來講,因爲B<=10,咱們只關心的是B的最小質因子p以及它的指數q。
簡單的說,咱們只要統計N!K的值中,質因子p的指數Q,計算Q div q就行了。
因爲對1e9+7取模,div比較麻煩,因此:Q div q = (Q - Q mod q) / q
再因爲K比較小,因此矩乘一下就好了。
誰來治一治我普及組級別的網絡流水平啊o(╥﹏╥)o
複雜地來講,黑白染色,每一個格子拆成兩類點:橫方向點和縱方向點,
因爲兩份流量都流入橫方向點或都流入縱方向點都會產生1的費用,
因此將方向點拆點,連兩條邊,一條流量爲1,費用爲0;另外一條流量爲1,費用爲1。
Topcoder也會出這種無腦題?
若a能到達b,那麼b也能到達a。
若是從一個圓到達另外一個圓,其可到達範圍是兩個圓環。
每一個圓環看成一個點,就能夠建圖跑spfa。
須要特判一些特殊狀況(*/ω\*)
枚舉分界點,貪心求最小代價就好了?
因爲口胡我可能沒想清細節。。
以個人智商看來是作不動這種腦洞題啊。
每次x能夠+1,-1,不變,y也能夠+1,-1,不變,且x,y至少有一個變,這個很煩啊。
根據題解的作法,咱們把座標軸旋轉45°,題目變成了:
每次x能夠+1或-1,y也能夠+1或-1,且x,y獨立!這一步轉化好妙啊!
接下來就好作了,對於一個終點Z,
對於Zx,能夠求出x方向上的方案數;對於Zy,能夠求出y方向上的方案數。
答案是sigma Zx,Zy [Fx(Zx)*Fy(Zy)] = sigmaZx[Fx(Zx)] * sigmaZy[Fy(Zy)]
對於給出矩形中的非從左邊連到右邊的地道,這些地道會造成括號序列,
對於從左邊穿到右邊的地道,多是從左往右,也多是從右往左?
從上往下進行dp?
彷佛怎麼想也想不清啊。。反正是口胡,放棄思考了。。
每次想網絡流題都要想很久很久~~。。
先進行黑白染色,因爲L字形角落的格子必定黑色,兩端的格子必定白色,
兩端的格子,必定有一個在奇數行,一個在偶數行。
源點流向奇數行,偶數行流向匯點就好了。
Topcoder罕見的放鬆題啊。
咱們考慮給你的矩陣中兩個元素x和y,若它們在字符串中的位置相同纔可能發生衝突。
位置相同當且僅當x和y的位置差能被Len整除,這樣的len最多隻有i0*j0*sqrt(i0*W)種
對於這樣的每一種len,暴力判斷是否合法以及計算方案數,
若是不存在這樣的衝突,方案數爲26^(Len - i0*j0)。因此等比數列求和便可。
又是網絡流。┭┮﹏┭┮
好難哇,怎麼作啊。。
在此給出周欣的算法:
若是把相鄰兩個格子之間新建一個虛點,選擇這個虛點,就表示這兩個格子在一次染色中完成。
因爲染色過程不能轉彎,這限制了一個格子橫放向上的虛點和縱方向上的虛點不能同時選。
這就是二分圖最大獨立集問題,能夠用網絡流解決
看到題目描述中的鹿角,莫名想到喬巴~~
簡單地說,能夠枚舉兩個聯通塊之間的分界邊,而後進行dp,
考慮f[a][b]表示以a爲根節點,b爲根節點,a聯通塊與b聯通塊同構的最大大小。
a的若干個兒子和b的若干個兒子一一匹配,其f值的和+1就是f[a][b]。
這就是二分圖最大權匹配
若是當前咱們知道了對手以前扔出a個剪刀,b個石頭,c個布,咱們能夠經過dp預處理求出下一次對手扔剪刀、扔石頭、扔布的機率。
而後咱們當前作出最優決策,使這一回合的指望得分儘量的大。這也是一個dp。
簡單博弈,咱們能夠證實,Rabbit不會將棋子向上移,
當Rabbit在某一行,且下方有障礙時,Eel不會放障礙,
以此咱們得出一個結論,Rabbit在一行中的運動是,左,右,左,右,左,......最後下。
咱們還能夠得出一個結論,當Rabbit在某一行某一列上,且此時Eel沒有在它下方放上障礙,那麼Rabbit也必定會往下走了(往左右走以後還必定會回到這裏)。
因此能夠用區間dp。f[i][L][R][0 or 1]表示第i行,已經放了L到R的障礙(即Rabbit已經走過了L到R),此時Rabbit在L-1仍是在R+1。
每次Eel決定Rabbit下方是否有障礙,若是有障礙,則Rabbit決定往左或往右。
聽說cwy用奧妙重重的騙分方法A了此題?說不定那也是對的喔。。
聽說暴力的複雜度是對的??
若是當前行以前的行已經肯定,當前行的上一行中有一些仍是白色,
它限制了當前行的某些列必須進行操做,其餘列必須不操做。
對於這些列,若是之前有過操做,那麼當前的操做種類已經肯定。不然當前有兩種選擇:操做1和操做2。
複雜度證實:
假設有m列進行過操做。每一列最多會產生一次兩種選擇,複雜度2^m。
因爲m列是在M列中選擇的。枚舉子集中的子集複雜度是3^M。
參考了VFK的題解(http://vfleaking.blog.163.com/blog/static/174807634201352023221271/)
好妙的數論題哇。
首先咱們發現只要計算b=2和b=3的半完美數便可。由於b>3的半完美數均可以用b=2或3來表示。
假設P2(x)表示x中不含平方因子。P3(x)表示x中不含立方因子
咱們能夠用P2(x)表示b=2的結果,P3(x)表示b=3的結果。
最後一步就是求出能夠用b=3表示,但不能用b=2表示的半完美數的個數。
若是能表示成b*y^3(且P3(b)=True)。那麼b*y^3 = (b*y) * y^2
再假設k^2|(b*y),且P2(b*y/(k^2))=True(即k^2是b*y的最大的平方因子)
那麼能夠表示成:b*y/(k^2) * (y*k)^2。因此b*y/(k^2) >= (y*k),即b>=k^3
初步列出式子:
咱們發現,這個P2(b*y/k^2)不太好處理。
因此企圖把它拆掉。
設k' = k^2 / gcd(k^2,b);
b' = b / gcd(k^2,b);
y' = y / k';
P2(b*y/k^2) = P2(b'*y/k') = P2(b' * y') = (P2(b') * P2(y')) AND (gcd(b',y')==1)
咱們成功地把它拆掉了。再轉化一下式子:
咱們發現這個gcd很煩,咱們用莫比烏斯反演解決:
咱們能夠預處理最後面那個sigma。前面的複雜度是n^(1/3)*log(n)*log(n)。
指望回合數等於每一回合進行的機率之和。
若是第i回合進行,說明前i-1回合沒有實現每行每列至少一黑。
咱們能夠行集合和列集合,若是以前每一回合都在這之中選,那麼當前回合就會進行。這樣的機率是(sigma x)^(i-1) / S^(i-1)
因爲這樣枚舉可能重複,因此容斥一下便可。根據行集合+列集合的大小的奇偶性來判斷+-符號。
這樣能夠算出第i回合進行的機率。
可是對於每個i,都要計算,這很麻煩。咱們發現i只出如今指數上,而枚舉的i是從1到無限大。因此能夠用無窮長的等比數列求和公式來計算。
這樣咱們獲得了一個優秀的2^(n+m)的算法。咱們發現數據範圍n*m<=150(很小?)
我信心滿滿地寫了一個,樣例都Tle了。。
怎麼辦呢?咱們還漏了一個條件:每一個格子上的數是0到9範圍。。
因此咱們發現這個公式中底數的範圍只有0到3600,因此有不少項是重複的。對底數進行dp便可。
咱們能夠輕鬆建圖,只要求一個有向圖最小生成樹就能夠了。
聽說能夠用朱劉算法?
我不會啊QAQ
咱們枚舉三角形的一個頂點,若是已知第二個頂點,第三個頂點有一個可行區間。
已知隨着第二個頂點的順時針移動,第三個定點的可行區間是單調的。
再因爲只有20個點,因此能夠先預處理20個點的凸包,可能還要預處理可行區間左端點的前綴和數組,
可能差很少就作好了吧。。
顯然,若字符串長L,那麼這個輕的字符串知足有min(26,L)種字符,且相同字符挨在一塊兒。
顯然就能夠dp了,f[i][j][k]表示前i個字符串已經完畢,出現j種不一樣字符,其中有k種字符從此還要再出現,的最小重量。
考慮當前字符串,咱們已知了字符種數,
其中有一些鏈接了以前的字符,而且以後還要出現,它對重量的貢獻是L;
有一些鏈接了以前的字符,以後不會出現,它對重量的貢獻是前綴長度;
有一些是新出現的字符,但以後不會出現,它對重量的貢獻是它在這個字符串中的長度;
有一些是新出現的字符,以後還要出現,那麼它對重量的貢獻是後綴長度。
根據必定的貪心結論,前綴長度越短越好,後綴長度越短越好。那麼上述第一種字符和第三種字符必定排在中間。
一個很顯然O(n*26^5)的dp就出來了。
再根據必定的貪心結論,第一種字符變成第二種,同時第三種字符變成第四種,這樣必定更優,
因此複雜度變成O(n*26^4)
被題解的作法深深地震撼到了。。
考慮2*2的方格,必定全N或全Z,或兩個N,兩個Z。
推廣到n*m,任意2*2方格知足這個條件,就必定能被三染色。
分析這個條件,設N=0,Z=1,咱們發現相鄰兩行要麼徹底相同,要麼徹底相反。相鄰兩列也是同樣。
因此咱們能夠構造h[i]數組,構造g[i]數組來表示整個能被三染色的矩陣,矩陣中cells[i][j] = h[i] xor g[j]。
任意的h,g數組對應一個合法矩陣。而輸入的'N'或'Z'限制了h[i] xor g[j]的值。
因此能夠進行二分圖染色。再由於要字典序最小,因此染色的時候能夠貪心。
冷靜分析一下,這道題很是有意思,
考慮如今Alice到達一個點,這個點提根後有多個子樹,且Bob可能存在於這些多個子樹中。
考慮若子樹a大小<=2,那麼Alice能夠進入a一步,去清除Bob存在於該子樹的可能,而後回到根。
這樣,Bob沒法從一個子樹飛往另外一個子樹。
而若是子樹a大小>2,Alice進入a會到根至少須要4步,用這段時間Bob可能飛到其餘各個子樹中。對Alice極爲不利。
因此咱們來分析Alice的策略:
只有1個子樹a大小>2:進入a,清除Bob在a的可能性,以後依次清楚其餘子樹。
只有2個子樹a、b大小>2:進入a,清除Bob在a的可能性,以後清除除a,除b之外其餘子樹,最後清除b。
有3個子樹a、b、c大小>2:涼涼。。Bob不管什麼時候都有可能在兩個大小>2的子樹中。
因此咱們獲得了Bob的策略,在不被Alice抓到的同時,走到一個節點,使得這個節點提根後有至少3個子樹大小>2
咱們也獲得了Alice的策略,不讓Bob的計謀得逞。。
因此,當存在一個點 P ,知足 dis(A,P)>=dis(B,P)+2,且以 P 爲根時有至少 3 個子樹的深度大於等於 3 時,Bob 勝,不然 Alice 勝。
按M>sqrt(N)或M<sqrt(N)分狀況討論便可。
這是道較爲有趣的題,
咱們發現,a[i]數組合法的充要條件是
a[1]=0,若i>0,則a[i]>0。且若是i,j相連,那麼abs(a[i]-a[j])<=1。
有了這個結論以後,咱們把每一個點都拆成n個點,第k個點和第k+1個點連通表示當前這個點的權值a至少爲k。
很容易建出網絡流模型,跑一遍最小割便可。
一句話題解:輪廓線動態規劃(狀壓dp)
DFT(a) = DFT(p) * DFT(p),已知a,求p。
p = DFT^(-1)( sqrt(DFT(a)) )
因爲sqrt的時候,每一項有正負兩種值,須要枚舉。
由於p關於0對稱,因此只要枚舉2^(n/2)種狀況便可。
(聽說還能夠用NTT來排除精度偏差?)
暴力dp是O(n^2)的。很容易發現當右端點爲i時,左端點j可行的取值區間只有不超過log(n)段。
這樣很容易實現O(nlogn)複雜度的dp.
題解給了一個優秀的O(n)作法。
咱們考慮,若是一個區間的左邊一半全是問號,左端點爲i,右端點j可行的取值區間只有一個。
若一個區間左邊一半至少有一個'w',右端點爲i,左端點j可行的取值區間也只有一個。
前者從當前dp值對以後一段區間的dp值有貢獻,能夠前綴和優化。
後者前面一段區間的dp值對當前dp值有貢獻,也能夠前綴和優化。
很是有趣的題哇
很容易發現:答案<=4
又很容易發現,每次取走一塊矩形的時候,對局面有影響的只有兩個值:比x小的數中被取走了多少個數,比x大的數中被取走了多少個數。
咱們設比x小的數中被取走了p個,比x大的數中被取走了q個。
很容易證實,p是定值的時候,q越大越好。
因此咱們能夠進行DFS!
每次DFS,枚舉p的值,O(1)求出當前狀態下,q的最大值。
很容易發現,DFS只要枚舉兩層。在第三層咱們O(1)判斷是否能夠一次性取完只剩x,不然答案就是4。
複雜度O(n^2)。
根據經典套路,一個凸包的面積是凸包上相鄰兩個點與原點造成的向量的叉積的和的1/2
只要計算任意兩個點,成爲凸包上相鄰兩個點的機率,就能夠計算它們對指望答案的貢獻。
即這兩個點所在直線的一側沒有點。
若F(x)%m=0,則F(x+m)%m=0
因此咱們能夠對於全部x%m的餘數,求出x至少是多少才知足F(x)%m=0
先對m分解質因數:m=p1^k1*p2^k2...*pn^kn
求出最小的x,使得x%m=x',F(x)%(pi^ki)=0。(能夠對於全部的pi,求出對應的最小x,而後取其max便可。)
存在(x-j^2)%pi=0
存在j^2 %pi = x % pi
預處理x所對應的可能的j%pi。
因此,咱們能夠暴力地從小到大枚舉全部可能的j,再求出所對應的比j^2大的x,判斷F(x)分解質因數後是否有ki個pi。
因爲ki很小(log級別)!因此複雜度是對的
咱們考慮,在原來2*M的表格下面,再添一行,變成3*M的表格。
對於每一列,因爲相鄰兩個顏色不同,咱們把第三行的那個格子顏色塗成與前兩行顏色不一樣的第三種顏色。
因爲每種顏色在任意一個2*2矩陣中至少出現了一次,因此第三行中相鄰兩個格子顏色也不一樣。
以上,題意轉化爲了M-R個紅球,M-G個綠球,M-B個藍球排在同一行,相鄰兩個顏色不一樣的方案數。
緊接着咱們發現,相鄰兩個藍球之間,紅綠球必然交替出現。當長度爲偶數時,紅綠個數相同。當長度爲奇數時紅比綠多一球,或反之。
因而,枚舉長度爲奇數的段數,由M-R和M-G可知其中有多少段紅比綠多一。接着就能夠直接用組合數計算了。
感受是很顯然的樹形dp?
若是p的兩個兒子a,b,a,b的子樹內都沒有信標,那麼a,b內相同深度的點沒法區分。
用這一性質進行樹形dp
咱們先把trie樹建出來。要求給trie中字符串結尾的節點標號0到n-1,使得知足性質。
因而樹形dp的想法就出來了。
然而限制涉及到的點數有8*2=16個,要開2^16的狀態。暴力3^16轉移複雜度不可觀。
注意其實轉移的時候枚舉的不少次子集都是沒有用的。
咱們假設dp時要枚舉子集a,枚舉子集b。而後把a、b合併起來。
對於一條限制s是t的前綴,顯然s不能單獨出如今a或b中,同時子集a和子集b不能有交。
對於這一種限制,
a:空, b:空;a:t, b:空;a:空, b:t;a:空, b:{s,t};a:{s,t}, b:空。 有最多5種轉移。
因此總複雜度爲5^8*50。(咱們須要先預處理這些可能的子集轉移)
————————————————華麗的分割線—————————————————
到此爲止,SRM562到SRM599的題就結束了。
再宣傳一下傳送門^_^