Time of Update: 2018-12-05
求n*n的棋盤上放K個象的放法, 象可以對角線相互攻擊解法:把紅色方格從棋盤中抽出,再將棋盤和小方格都旋轉45°再壓縮,由於兩種顏色的棋盤互不攻擊,印刻可以看成兩個棋盤,格子棋盤上變為放只能上下攻擊的車的個數(詳見黑書p244)。Sgu 221 Big Bishops解法同上,只是把資料放大了,超long long ,用java裡的BigInteger.Sgu 222 Little Rooks用組合數學或者sug220的方法 可以很快求解,狀態壓縮則需要當k>=n時,時間複雜度為O(n*2
Time of Update: 2018-12-05
一、基本問題:1.到底什麼是割:原始點集為V,選出一些點集S使得s∈S,T=V-S,t∈T,則S到T的邊為S到T割,記做[S,T]。2.什麼是最小割:圖中所有的割中,邊權值和最小的割為最小割!3.割得容量容量和流量計算的區別:割[S,T]的容量為∑(邊(u,v)的容量和),其中u∈S,∈T。也就是說割的容量不計算反向的邊!!而流量為正向的和反向的代數和。4.最大流-最小割定理:最大流的值為最小割的容量!5.怎樣求割:求完最大流後,在殘留網路中從source開始dfs,被染色的為S,未被染色的為T
Time of Update: 2018-12-05
題意:某人手上有一串珠子,順時針編號1--n,每次可進行三種操作:順時針旋轉一個珠子,逆時針旋轉一個珠子,將手中的珠子移去(移去後順時針方向下一個珠子進入手中),問按標號12345順序將所有珠子逐一移去,最少需要多少次操作。分析:假設當前要移除的珠子為x,x左邊的珠子用A代表,右邊的珠子用B代表即AxB,則無論左移還是右移都會得到xBA,即移去某個珠子對後面的珠子無影響,每次只需單獨考慮A和B的長度,取最小累加即可。做法:比賽時想複雜了,想維護每個珠子position的變化,一度想用伸展樹旋轉,
Time of Update: 2018-12-05
消圈演算法: 先求最大流, 再在Gf中尋找負費用圈並沿它增廣改進: 增加附加弧(s, t), 費用大於s-t最大費用路(如VC), 弧上的初始流大於s-t最大流(如s出發的弧容量和加1)消圈演算法將讓盡量多的流移出附加弧, 因此得到的流是最大流. 最後附加弧可能有餘量,應當忽略實際效果: 最小費用增廣路演算法, 因為Gf中任何s-t路和t-s一定構成負費用圈最壞情況分析: 每次找負費用圈O(VE), 每次只把費用更新1, 一共需要ECM次(M為最大費用, C為容量),
Time of Update: 2018-12-05
題意:給出一張有向圖,每條邊長度均為1,問至少刪掉幾個點,使得從1到n的最短路徑長度大於k(長度小於等於k的不相交路徑數目)第一種可以AC的做法:先求一次最短路,對於d[1][i]+d[i][n]>k的點一定是不需要去除的,然後對於剩下的點,求至少刪掉多少個點使其不連通,典型的有向圖點連通度問題,拆點求最小割即可,但是過不了這組資料:8 10 51 22 33 44 55 66 81 77 84 77 4畫個圖明顯知道錯在哪了,然後就有了第二張可以AC的做法:把每個點拆成兩個點,a1和a2
Time of Update: 2018-12-05
將整個區間分為sqrt(n)段小區間,每個段長度為sqrt(n),並維護每一段的統計量,這樣可以在sqrt(n)時間內完成一次區間查詢或更新。平衡查詢和更新之間矛盾是資料結構設計時的重要考慮因素,而這種做法是經典的平衡做法,早就瞭解,但以前沒有遇到過只能用“分段”解決的題目,因此總覺著這是迫不得已的“賴招”,也從來沒有寫過,昨天第一次寫,小細節沒注意,結果悲劇的寫成每次查詢O(n)了。總結一下錯誤:1.對於整個區間的更新,不需要實際處理每個元素的值,只需要用一個變數標記一下即可,當整段元素更新量
Time of Update: 2018-12-05
Matrix-Tree定理(Kirchhoff矩陣-樹定理)解決簡單平凡無向圖的產生樹計數問題最有力的武器之一1、G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:當i≠j時,dij=0;當i=j時,dij等於vi的度數。2、G的鄰接矩陣A[G]也是一個n*n的矩陣, 並且滿足:如果vi、vj之間有邊直接相連,則aij=1,否則為0。我們定義G的Kirchhoff矩陣(也稱為拉普拉斯運算元)C[G]為C[G]=D[G]-A[G],則Matrix-Tree定理可以描述為:G的所有不同的產生樹的個數
Time of Update: 2018-12-05
問題描述:Chinese poster-man problem,簡稱CPP,給出一張連通圖,問經過每條邊至少一次且起點和終點相同,所需走的最小路程。無向圖CPP1.考慮當所有點度數均為偶數時,該圖是歐拉圖,因此任意一條歐拉迴路都是答案2.當有兩個點是奇度點的時候,只需找到這兩點間的最短路徑,將最短路徑上的邊計入到原圖中,這是得到了一張歐拉圖(poj 1237 The Postal Worker Rings
Time of Update: 2018-12-05
圖的連通度問題:在圖中刪去部分元素(點或邊),使得圖中指定的兩個點s和t不連通(不存在從s到t的路徑),求至少要刪去幾個元素。圖的連通度分為點連通度和邊連通度:(1)點連通度:只許刪點,求至少要刪掉幾個點(當然,s和t不能刪去,這裡保證原圖中至少有三個點);(2)邊連通度:只許刪邊,求至少要刪掉幾條邊。並且,有向圖和無向圖的連通度求法不同,因此還要分開考慮(對於混合圖,只需將其中所有的無向邊按照無向圖的辦法處理、有向邊按照有向圖的辦法處理即可)。【1】有向圖的邊連通度:這個其實就是最小割問題。以
Time of Update: 2018-12-05
題意:給出一個M*N 的矩陣,矩陣中每個元素都有一種顏色(1 ≤ N, M, C ≤ 100),10000條查詢,更改某個元素的顏色或查詢某種顏色的corss有多少個。We say there exists a cross of size k centered at the cell (x,y)iff all cells lying in the x-th row or the y-th column and within a distance of k from (x,y) share
Time of Update: 2018-12-05
以下內容是從AekdyCoin的一篇文章裡看到的,源處處不明,只是感到很神奇,尚未發現用武之地。下面所說的演算法由於相比於Tarjan和nlogn的做法會複雜一些,因此用的也不多。不過出於好奇,我還是研究了一下。眾所周知,lca和rmq就像情侶一樣關係緊密。lca可以由dfs一次轉化為+1rmq問題,而+1rmq是可以用O(nlogn)-O(1)或O(n)-O(1)做出來的,不過寫起來會比較麻煩而且細節很多,具體的做法就不贅述了。接下來要講的O(n)-O(1)線上lca的演算法和rmq沒有絲毫關
Time of Update: 2018-12-05
題意:有150000個數,10000條操作,每次將第i個數變為x,訊問每次操作後逆序對的數目。解法1:樹狀數組+treap,樹狀數組的每個元素都是一棵樹,這樣可以在lognlogn時間內查詢前i項有多少個小於等於k的元素,當某個元素法師改變時,只需從樹狀數組中對應的treap中進行元素的刪減,每次修改前後統計的第i個元素形成的逆序對數,便可知每次操作後逆序對的數目。由於Treap常熟很大,因此雖然複雜度不高但是效率很低解法2:Sqrt(N)分塊+排序,統計前i項小於k的元素個數,類似於spoj3
Time of Update: 2018-12-05
SPOJ 3978 Distance
Time of Update: 2018-12-05
劉汝佳資料結構專場F題,點擊開啟題目連結。在一個矩陣內完成以下操作:1.將某子矩陣的值全部加v2.將某子矩陣的值全部變為v3.輸出某子矩陣的最大值最小值及總和。由於矩陣至多隻有20行,因此可以維護20棵線段樹。維護變化統計量時要考慮多種次序,例如未更新的節點先加後邊和先邊後加,變化的優先順序應高於加。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import
Time of Update: 2018-12-05
Poj 1850 Code題意:由最多8位的小寫字母組成的單詞(每個單詞各個位置上的字母按照升序排列)先按長度排序再按照字典序排列,先給出一個單詞,問此單詞的排名;解法:首先求出長度小於l該單詞長度的單詞的個數。然後開始統計相同長度且排在前面的單詞數,從第一個字母開始,對於每個字母x,求出第i為是x前面的字母時能組成多少單詞。。。int res=0,len=s.length(),last=-1;for(int
Time of Update: 2018-12-05
題意:給出一棵樹,每個點有一個點權,問一x為根的子樹中有多少種權重恰好出現了k次。懶了,直接貼題解,況且本來也不是自己寫出來的#include <cstdio>#include <cstring>#include <algorithm>#include<cmath>#include<map>using namespace std;const int maxn = 100010;struct node {int be, ne;void
Time of Update: 2018-12-05
題目連結http://acm.sgu.ru/problem.php?contest=0&problem=263題意:現有10^6個位置(cell),每個位置上可以放若干個cube,對於任意的兩個數i<=j如果滿足[i,j]之間任意位置都有cube且i-1和j+1沒有箱子,則稱[i,j]為一個Tower。現有10^6條修改和查詢,保證合法性:put <x> <c> - put c cubes on cell xtput <t> <x>
Time of Update: 2018-12-05
題目連結題意:一個俱樂部有 n名成員,每名成員有兩個屬性:聲望r和年紀a(均為109)。若干個個可以組成一個小組,每個小組中有一名組長,要求這名組長的聲望高於其他成員且這名組長與組內任意成員的年齡差小於k,先給出10000條查詢,問如果a、b兩人在一個小組中,那麼這個小組最多可以有多少人。解法:1.由於n和a相差很大,因此首先要對聲望和年紀進行離散化
Time of Update: 2018-12-05
A. Little Elephant and Problem題意:給出一個數組,問是否是由一個已排序的數組經過交換至多一對數得到。解法:將給定的數組排序後與元數組比較,若有多於兩個位置不同則不是,否則將原數組兩個位置的數字交換後比較是否與排序後數組相同。B. Little Elephant and
Time of Update: 2018-12-05
對於平面圖有如下性質:1.(歐拉公式)如果一個連通的平面圖有n個點,m條邊和f個面,那麼f=m-n+22. 每個平面圖G都有一個與其對偶的平面圖G*3. G*中的每個點對應G中的一個面4.對於G中的每條邊e,e屬於兩個面f1、f2,加入邊(f1*,f2*)。如果e只屬於一個面f,加入回邊(f*,f*)。平面圖G與其對偶圖G*之間 關係:1. G的面數等於G*的點數,G*的點數等於G的面數,G與G*邊數相同2. G*中的環對應G中的割一一對應我們可以利用最大流—最小割定理轉化模型。根據平面