資料結構-SBT(Size Balanced Tree)

/*************************************************資料結構:SBT(Size Balanced Tree),又稱傻逼樹;資料域:範圍key,左孩子left,右孩子right,保持平衡的size;性質:每棵子樹的大小不小於其兄弟的子樹大小;插入:插入演算法先簡單插入節點,然後調用一個維護過程以保持性質;刪除:刪除操作與普通維護size域的二叉尋找樹相同;最大值和最小值:由於SBT本身已經維護了size域;所以只需用Select(T,1)來求最大值;

資料結構-Trie樹

/**********************************************************資料結構:Trie樹,又稱單詞尋找樹或字典樹,是一種樹形結構,是一種雜湊樹的變種;基本原理:Trie樹的核心思想是空間換時間,利用字串的公用首碼來降低查詢時間的開銷以達到提高效率的目的;應用:用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文本詞頻統計;優點:最大限度地減少無謂的字串比較,查詢效率比雜湊表高;基本特性:(1)根節點不包含字元,除根節點外每一個

高精度除法

/********************************************演算法思想:反覆做減法,看看從被除數裡最多能減去多少個除數,商就是多少;所以演算法核心是寫一個大整數的減法函數;反覆調用該函數進行減法操作;演算法步驟:用數組a表示被除數,數組b表示除數,數組res表示商;先用被除數a減去除數b得到差的位元k,同時商+1;再用被除數a減去若干個除數b*(10^k);不夠減了,再減去若干個除數b*(10^(k-1))...b*(10^(k-2))...;一直減到不夠減為止;每

最小費用最大流演算法

/***************************************************演算法引入:任何容量網路的最大流流量是唯一且確定的,但是它的最大流f並不是唯一的;既然最大流f不唯一,因此,如果每條弧上不僅有容量限制,還有費用r;即每條弧上有一個單位費用的參數,那麼在保證最大流的前提下;還存在一個選擇費用最小的最大流問題,即為最小費用最大流問題;演算法思想:尋找最大流的方法是從某個可行流出發,找到關於這個流的一條增廣路P;沿著P調整f,對新的可行流又試圖尋找關於它的增廣路,

線性時間求最大迴文子串的Manacher演算法

/****************************************************演算法引入:迴文串指的是一個正著讀和反著讀都一樣的字串;要在一個字串中求出它的長度最長的迴文子串;演算法思想:Manacher演算法可以在O(n)的線性時間複雜度的情況下;求出以每個字元為中心的最長迴文子串有多長;該演算法把奇數的迴文串和偶數的迴文串統一起來考慮;大大的減少了奇數串和偶數串分開處理的麻煩;該演算法充分利用了字元匹配的特殊性,避免了大量不必要的重複匹配;然後用一個輔助數組P記錄

CodeForces Round #112 Div2 165 D. Beard Graph

/*題目給定一棵樹,這棵樹很特殊,只有根節點的度可能超過2有三種操作

實現尾碼數組的倍增演算法和DC3演算法

/************************************************資料結構:尾碼數組(Suffix_Array);子串:字串S的子串r[i..j],i≤j,表示r串中從i到j這一段,也就是順次排列r[i],r[i+1],...,r[j]形成的字串;尾碼:尾碼是指從某個位置i開始到整個串末尾結束的一個特殊子串;字串r的從第i個字元開始的尾碼表示為Suffix(i),也就是Suffix(i)=r[i...len(r)];尾碼數組SA:尾碼數組儲存的是一個字串的所有尾碼

uestc 1717 Journey

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <set>#include <vector>using namespace std;const int N=100009;int n,m;int a,b,c,x,y;int

hdu 4000 Fruit Ninja 樹狀數組+統計

/*比賽的時候沒有寫出來,賽後請教大牛後寫的可以先求出(xyz,xzy)的總數量只需出去x後面多少個比它大的個數n,C(n,2)就是瞭然後求出xyz的個數,對於a,求出比a小的個數low[a],比a大的個數high[a],low[a]*high[a]就是答案可以藉助樹狀數組求上述個數*/#include <cstdio>#include <iostream>#include <memory.h>using namespace std;const int

樹上兩點的最近公用祖先-Tarjan_LCA離線演算法

/* *演算法引入: *樹上兩點的最近公用祖先; *對於有根樹的兩個結點u,v,最近公用祖先LCA(T,u,v)表示一個結點x,滿足x是u,v的祖先且x的深度儘可能大; *對於x來說,從u到v的路徑一定經過點x; * *演算法思想: *Tarjan_LCA離線演算法; *Tarjan演算法基於dfs的架構,對於新搜到的一個結點,首先建立由這個結點構成的集合,再對當前結點的每個子樹進行搜尋; *每搜尋完一棵子樹,則可確定子樹內的LCA詢問都已解決,其他的LCA詢問的結果必然在這個子樹之外;

CodeForces Round #111 Div.2 problem D 160D

/*題意:最小產生樹and tarjan.給定一個簡單無向連通圖G(v,e),他的最小產生樹為T(不一定唯一),對於圖中的任意一條邊,如果它不可能在T中,輸出none,如果它一定在T中,輸出any如果它可能在T中,輸出at least one題解:只有有相同權值的邊的時候才可能出現at least one的情況G的點集為N如果

流量有上下界的網路的最大流和最小流演算法

/************************************************************演算法引入:基礎的網路流的每一條弧<u,v>都對應一個弧容量c(u,v)>=0;而有上下界的網路流中,每條弧對應兩個權值b(u,v)和c(u,v),即為弧流量的下界和上界;很顯然基礎的網路流中為其特殊情況,即b(u,v)==0的時候;演算法分析:(1)最大流:當b(u,v)>0的時候,這種有上下界的網路流不一定存在可行流;所以演算法首先得判斷該網路是否

CodeForces Round #112 Div2 165 E. Compatible Numbers

/*經典DP一定一個數組a1,a2,a3.....對於每一個ai在此數組中找到一個數aj,使得ai&aj=0,如果沒有這樣的aj,輸出-1;n最大1000000.對於一個ai,按位取反後的數x,肯定滿足ai&x=0;但aj=x是充分不必要條件,對與x,它的二進位中若干個1變為0並不影響ai&x=0;所以只要數組中存在這類x中的一個就行了。*/#include <iostream>#include <algorithm>#include

有向圖的強連通問題+Tarjan演算法

/****************************************************演算法引入:在有向圖G中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通;如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖;非強連通圖有向圖的極大強連通子圖,稱為強連通分量;演算法介紹:Tarjan演算法是基於對圖深度優先搜尋的演算法,每個強連通分量為搜尋樹中的一棵子樹;搜尋時,把當前搜尋樹中未處理的節點加入一個堆棧,回溯時可以判斷棧頂到棧中的節點是否為一個強連通分量;定義dfn(u)

UVA10766(Organising the Organisation)產生樹計數-Matrix-Tree定理

/* *題目地址: *http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1707; * *題目大意: *Jimmy在公司裡負責人員的分級工作,他最近遇到了一點小麻煩; *為了提高公司工作的效率,董事會決定對所有的員工重新分級; *即除了一個總經理例外,其他所有的員工有且只有一個直接領導;

10954 – Add All

描述:就是構建哈夫曼樹,然後再把構建哈夫曼樹過程中出現的和(就是兩個數字相加所得到的新的數字)全部相加就是要輸出的結果了#include <cstdio>#include <cstdlib>#include <algorithm>int cmp(const void *p1,const void *p2){ return *(int *)p1 - *(int *)p2;}int num[5010],score[100010];int main(){

最小產生樹計數-Kruskal+Matrix_Tree定理

/* *演算法引入: *給定一個含有N個結點M條邊的無向圖,求它最小產生樹的個數t(G); * *演算法思想: *拋開“最小”的限制不看,如果只要求求出所有產生樹的個數,是可以利用Matrix-Tree定理解決的; *Matrix-Tree定理此定理利用圖的Kirchhoff矩陣,可以在O(N3)時間內求出產生樹的個數; * *kruskal演算法: *將圖G={V,E}中的所有邊按照長度由小到大進行排序,等長的邊可以按照任意順序;

POJ 1286 Necklace of Beads && POJ 2409 Polya計數原理

/*旋轉:n個點順時針或者逆時針旋轉i個位置的置換,迴圈數為gcd(n,i)翻轉:N為偶數時:(1)這種是經過某個頂點i與中心的連線為軸的翻轉,即對稱軸過頂點,有對稱性,迴圈數為:n/2. 所以此種共n/2種翻轉:(2)這種是以頂點i和i+1的連線的中點與中心的連線為軸的翻轉,即對稱軸不過頂點,同樣,根據對稱性,迴圈數為n/2+1.且有n/2種翻轉。N為奇數: 迴圈數為(n+1)/2.所以給定長度n,共有2n種置換。*/#include<iostream>#include

111 – History Grading

描述:題意倒是挺難理解的:給出一個整數n,下一行有n個數,這是正確答案,但是需要轉化一下 10 3 1 2 4 9 5 10 6 8 7 ->代表第一件事發生在下標3,第二件事發生在下標1,第三件事發生在下標2……-> 2 3 1 4 6 8 10 9 5 7,以後的輸入都要轉化,並且和第一次輸入的作比較,尋找兩個數組最大的子序列,輸出最大子序列個數#include <cstdio>#include <cstring>int main(){

PKU1679(The Unique MST)判斷最小產生樹的唯一性-次小產生樹

/* *題目大意: *給出一個連通無向圖,判斷它的最小產生樹是否唯一; *如果唯一,輸出產生樹的大小,否則輸出"Not Unique!"; * *演算法思想: *本題可以嘗試求與最小產生樹權值相等的樹是否存在; *但是更好的思路是直接求次小產生樹,如果次小產生樹等於最小產生樹; *則說明最小產生樹不唯一,否則最小產生樹一定是唯一的; * *次小產生樹的求法詳見http://blog.csdn.net/jarily/article/details/8883858; *

總頁數: 61357 1 .... 13824 13825 13826 13827 13828 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.