Time of Update: 2018-12-05
經典線段樹問題,需要用上懶操作對於每個區間,記錄該區間從左端點開始連續的1和0的個數,從右端點開始連續的1和0的個數,整個區間最多的連續1和0的個數,以及這個區間是否被翻轉過每次訪問子區間時,如果父區間被翻轉過,子區間也要被翻轉,標記下移,更新完子區間後再向上更新查詢函數中不用向上更新,因為如果子區間被翻轉,在更新函數中父區間也肯定被翻轉過或更新過,父區間的資訊已經被修改,就算向上更新也不會改變父區間的狀態代碼:#include<iostream>#include<memory
Time of Update: 2018-12-05
瀏覽論壇看到的,收藏了~~~~JS的window對象視窗對象的屬性和方法:格式:[window.]屬性[window.]方法(參數)opener.屬性opener.方法(參數)self.屬性self.方法(參數)parent.屬性parent.方法(參數)top.屬性top.方法(參數)視窗名稱.屬性視窗名稱.方法(參數)視窗對象的屬性:document當前檔案的資訊location當前URL的資訊name視窗名稱status狀態列的臨時資訊defaultStatus狀態列預設資訊history
Time of Update: 2018-12-05
題意,給出一條邊,和經過這條邊的條件和經過這條邊的結果(條件:bug存在與否,結果:修補那些bug增加那些bug),求最短路剛開始糾結於理解題目的考察點,後來發現這是一個隱式圖的問題,bug數組的狀態對應一個個節點。很容易把bug的狀態與二進位聯絡起來,即有bugi,則第i位為1。後面的操作全部用位元運算進行。把最佳化的dijkstra演算法進行修改即可。需要注意的是這題給的範圍使得節點數有1<<20個,這樣無法建完整的圖,鄰接表也無法實現,在dijkstra演算法中,只能依次判斷每
Time of Update: 2018-12-05
題意:給出一個無向帶正權的圖,求s到t的所有路中,最小邊權最大的路的權。題意比較拗口,剛開始因為要求所有路的權,想到直接dfs,結果TLE。後來想到用動態規劃,可惜給出的圖不是無環圖(動態規劃為什麼不能用於有環圖?因為會陷入無線遞迴)。然後看提示,說是用dijkstra。dijkstra演算法中標號距離的數組d,用來標記從s到i最小邊權的最大值。每次進行鬆弛操作選取d最大的結點,原因是此結點值不可能再變大了。然後鬆弛操作的改變是d[y]=max(d[y],min(d[x],g[x][y]))。看
Time of Update: 2018-12-05
第一章 演算法在計算中的作用關於第一章的標題,我覺得是否是翻譯有誤或者不準確,應該改為 《演算法在電腦中的作用》 更為準確吧。第一章主要介紹演算法的用途和重要性。我自己總結為:1.解決問題。很多問題,我們可以人為的用自己的直觀感受加以解決,然而在遇到大量資料時,往往不可能通過人為方式解決。通過設定一系列完整的計算步驟,可以用電腦解決人無法解決的問題。2.最佳化解決問題的過程,即節省時間空間。記得在看公開課時,Charles教授有個很好的說法:效率相當於貨幣,你可以用它購買很多東西。例如我們利用很
Time of Update: 2018-12-05
dp方程為dp[i]=min{dp[j]}+1,2*a<=i-j<=2*b,表示一個噴頭控制範圍的右端點為i時,最少需要的噴頭數(i肯定為偶數)直接搞轉移是L^2的,但j是在由i確定的一個範圍內的,所以可以用單調隊列最佳化另外,這題比較麻煩的是如果i在某頭牛的區間內,i處就不能放噴頭,我們需要知道哪些地方不能放置,可以對區間先預先處理一下,能合并的就合并,然後用一個指標p指向當前區間,如果i大於等於區間右端點,指標右移,如果i大於區間左端點,不能放置另外需要注意的是隊頭元素可能是in
Time of Update: 2018-12-05
題意:給出一個s*a的圖,其中一些點是起點,每個交點只能經過一次,問是否所有的點都能走到圖的邊緣。這一題主要考察點是如何建圖,每個點只能經過一次,對應網路流中的每個邊容量是c,所以應該將每個點A拆分成兩個點A1A2,這兩個點之間的邊的容量是1。A與所有的相鄰點之間的邊的容量為1,但是此圖是無向圖,兩個點之間有兩條邊。建邊的規則是:相鄰點AB之間的邊:A2->B1,B2->A1;每個點A本身拆分出來的邊:A1->A2。這題中相鄰點之間的邊是可以多次經過的(規則允許,受限於不能多次
Time of Update: 2018-12-05
//XElement //一個根節點中包含多個子節點,一個節點相當一個XElement
Time of Update: 2018-12-05
Console.WriteLine("*******************String.CompareTo()*********************"); String strTestCompare = "abc"; //strTestCompare.CompareTo("abc")=0 //strTestCompare.CompareTo("ab")=1
Time of Update: 2018-12-05
定義dp[i][j][k]表示第i頭牛領頭,此時消耗j點能量,走了k圈的最少時間如果此時更換領頭的牛,dp[i][k][k]=min{dp[i-1][j][k],dp[i][k][k]}否則,dp[i][j][k]=min{dp[i][j][k],dp[i][j-sqr(x)][k-x]+1}狀態定義完後憑空想轉移不好想,對著題目給的策略自己手推了下第一頭牛和第二頭牛的式子,馬上就能寫出方程了:)最後枚舉下答案dp[i][j][d]就行代碼:#include<iostream>#in
Time of Update: 2018-12-05
為了加深對floyd演算法的認識,特地搜了一下floyd演算法的證明。原來floyd演算法的本質是一個動態規劃的過程。狀態轉移方程:f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])f[k][i][j]表示只經過前k個點(包括k),從i到j的最小值。當k從1到n時,就是從i到j的最小值。我們熟悉的用二維數組的寫法實際上是對空間的一種壓縮。解釋一下:計算只經過前k個點,從i到j的最小值時,有兩種情況需要考慮:經過第k個點和不經過第k個點。經
Time of Update: 2018-12-05
題意:給你一組單詞,判斷能否排列這些單詞使得前一個單詞的最後一個字母是後一個單詞的開頭字母。能則列印出這樣的排列。思路:把單詞的第一個字母和最後一個字母作為邊的兩個節點,單詞作邊,找歐拉路。第一次做歐拉路的題,這一題需要首先判斷有沒有歐拉路,依次判斷是否聯通(並查集),再判斷每個節點的度是否滿足要求,具體歐拉路的性質見離散數學。在找歐拉路的時候自己寫過一個dfs,大致是:void Euler(int cnt){ for(int i=0;i<n;i++) { if(
Time of Update: 2018-12-05
題意:給出一個數組,求一個最長的子數組si....sj,使子數組中si為最小值,sj為最大值。演算法上沒有可以說的地方,需要總結的是我做題時的思維方式。找出一段數組中的最大最小值可以確定用rmq來做,我開始的解決辦法是枚舉區間長度,複雜度是O(n^2),TLE。只能換個思路,枚舉起點,找某一起點出發的最大區間。我想當然的認為當i為起點的時候,r=rmqMax(i,n)就是終點,然後再判斷rmqMin(i,r)是否等於i來確定起點是i,如此枚舉,複雜度僅為O(n)。但是這樣的思路是錯的,原因在於當
Time of Update: 2018-12-05
首先貼出幾個書上虛擬碼對應的c的代碼MAX-HEAPIF:void MAX_HEAPIFY(int *a, int len, int i){ int l=LEFT(i),r=RIGHT(i); int largest=i; if(l<len && a[largest]<a[l]) largest=l; if(r<len && a[largest]<a[r]) largest=r; if(largest!
Time of Update: 2018-12-05
線段樹特殊的地方在於把連續的具有相同性質的資料,變成一個資料儲存,也就是父節點儲存了子節點的性質,父節點代表了一個區間。這樣,在詢問連續的資料的時候,可以通過轉化成訪問區間來減少訪問節點的數量。線段樹的寫法(hdu 1754):void build(int l,int r,int pos){ if(l==r) { scanf("%d",&mark[pos]); return; } int mid=(l+r)>>1;
Time of Update: 2018-12-05
先在字典樹中插入禁止序列11,123456,22,33,44,55,66,654321,然後構造矩陣,快速求冪,累計答案,看出模型的話,就跟POJ2778是一樣的題目代碼:#include<iostream>#include<memory.h>#include<string>#include<cstdio>#include<algorithm>#include<math.h>#include<stack>#inc
Time of Update: 2018-12-05
題意:給出一系列的點,兩兩點聯通有個半徑的限制,求出使指定3個點聯通需要的最少點。思路:開始以為是最小產生樹,但是最小產生樹求的是所有點聯通的情況。後來想到分別求以012這三個點為原點的最短路,沿著最短路數經過了多少點,找最少的一個(不能直接把最短路相加,因為兩條最短路會有重複的部分)。到現在也認為思路是對的,但是無法ac,不知道什麼原因。看了題解,原來這題應該這樣做:從這n個點中找到一個點,這個點到三個點的距離和最小。不用考慮重複的部分,因為如果最小的情況存在重複的部分,那麼一定會有更小的情況
Time of Update: 2018-12-05
題意:判斷給出的有向圖是否是半聯通的。半聯通圖:圖G中任意兩點u,v,u能到達v或者v能到達u。在網上找了很久,除了和這題相關的,幾乎沒有與半聯通分量相關的資料。演算法導論強聯通分量的習題裡也有求半聯通的演算法,答案的處理辦法是kosaraju縮點之後拓撲排序,然後按照拓撲排序的順序遍曆,驗證相鄰的兩個點是否有邊。直觀上看,如果是半聯通的圖,縮點之後應該成為一條鏈,那麼拓撲排序可以得到這條鏈,如果不能得到則說明此圖不是半聯通。同樣是從縮點之後半聯通圖是一條鏈出發,求出縮點之後的圖中的最長鏈也能驗
Time of Update: 2018-12-05
這個題很不錯哦,用到了最短路+二分答案+dfs,出題人太厲害了首先,100個點,總共的點的標號數目可能達到100,壓縮不了,那就只能dfs了,但肯定需要剪枝我自己想到的剪枝就是,先不管標號的問題,從終點做一次最短路,記錄路徑,如果源點不可達,則無解,如果這條路徑上的點剛好標號都不一樣,則輸出到源點的最短路徑然後就暴力dfs,如果當前長度加上不考慮標號時當前點到終點的最短路徑都大於當前最優解,就返回,這樣還是T了後來想能否快速找到一個可行解作為上限值,但不會找,查瞭解題報告才知道,可以二分答案,相
Time of Update: 2018-12-05
搞了半天,預先處理各種錯。。。先說下題目意思吧,不好理解,當時比賽的時候是以為把得到的S和每個Bi去比,Bi的每一位如果正確對上了就算得1分,結果範例直接沒過,就扔掉了後來看瞭解題報告和標程,發現應該是S和每個Bi去比,當Bi是S的子串時才得1分那麼我們可以用自動機來進行DP,首先預先處理對於每個Ai,可以和Aj的第幾位開始的尾碼進行link,然後剩下的自動機DP就比較簡單了定義dp[i][j][k]表示當前長度為i,且在自動機的狀態j,並且這個狀態是由link