Time of Update: 2018-12-06
周冬的《產生樹的計數及其應用》論文上講到過產生樹計數的問題。用到的是一個Kirchhoff矩陣,它是這樣定義的:a、設一個度數矩陣D,當i == j時,Dij = (i這個節點的度數),否則Dij = 0;b、設一個連通性矩陣A,如果i 和j連通,則Aij等於i到j的邊數,否則Aij等於0;Kirchhoff矩陣C = D -
Time of Update: 2018-12-06
最大公約數L和最小公倍數G的關係:1、L%G == 0;2、設A, B的最大公約數為G, 最小公倍數為L,則:L/G = (A/G)*(B/G)3、gcd(A/G, B/G) = 1; 題目:給出一對數A, B 的最大公約數G, 最小公倍數L。這裡A, B有多種組合。,求A,B的一種組合使得A + B最小。如果沒有則輸出-1(SRM535 div2 500pt)(G <= 10^12, L<=10^12)猛的一看資料很大。不過用上前邊的定理就可以解決了。領X = L/G;枚舉A/
Time of Update: 2018-12-06
定義:一個有向圖,存在從某個點開始的到達所有的的一個最小產生樹,則它就是最小樹形圖。從早晨到現在一直在翻資料,終於理解了一點。朱-劉演算法的大概過程如下:1、找到除了root以為其他點的權值最小的入邊。用In[i]記錄2、如果出現除了root以為存在其他孤立的點,則不存在最小樹形圖。3、找到圖中所有的環,並對環進行縮點,重新編號。4、更新其他點到環上的點的距離,如:環中的點有(Vk1,Vk2,…
Time of Update: 2018-12-06
我沙茶了,看了半天沒看懂範例!後來問別人才知道。然後卑鄙,下流,無恥的看了別人的思路。無語了。思路:dp[i][j],表示前i件物品掛上以後偏倚量為j時的情況數。總情況數為15*20*25 = 7500。所以dp[i:1~20][j:-7500 ~ 7500],可以用dp[i][j:0~15000];My Code:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include
Time of Update: 2018-12-06
2-SAT水題,還wa了好幾次,可見本菜更水。。。課件上都有講解。。。渣代碼:View Code #include <iostream>#include <cstring>#include <cstdio>#include <stack>using namespace std;const int N = 2012;const int M = 1000000;struct node {int to;int next;} g[M];int
Time of Update: 2018-12-06
轉載自:http://hi.baidu.com/diannaochina/blog/item/48dfff33c3c36840ad4b5fb5.html一、最近公用祖先(Least Common Ancestors)對於有根樹T的兩個結點u、v,最近公用祖先LCA(T,u,v)表示一個結點x,滿足x是u、v的祖先且x的深度儘可能大。另一種理解方式是把T理解為一個無向無環圖,而LCA(T,u,v)即u到v的最短路上深度最小的點。這裡給出一個LCA的例子:例一對於T=<V,E>V={1,
Time of Update: 2018-12-06
題意是:給一些座標點,如果兩點之間的距離小於R,並且兩點之間沒有其他點,則這兩個點保持連通,這樣構成了一個圖。問這個圖中產生樹的個數。因為資料量並不大,O(N^3)的建圖沒有問題。建好圖以後就可以用kirchhoff矩陣計算產生樹的個數,之所以寫這道題的解題報告是因為在高斯消元解kirchhoff矩陣時,需要用到逆元。(a/b)% mod,如果a,b的範圍很大,結果會有很大的誤差,這裡可以轉換一下 b*x = 1(% mod)則x為b的逆元 (a/b)%mod =
Time of Update: 2018-12-06
又是幾天不做題,一個二進位最佳化的多重背包讓我寫的狗屁不通,錯漏百出!TLE, WA了好幾次,都是細節啊。思路,很裸的多重背包。My Code: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 const int N = 100010; 8 const int M = 1024; 9 10 int f[N];11
Time of Update: 2018-12-06
歐幾裡德演算法也就是一般說的輾轉相除法。代碼架構如下:int gcd(int a, int b) {return b ? gcd(b, a%b) : a;}粗數量級估計需要進行O(log b)次整數運算。實際上,當n固定後gcd(m, n)的平均迭代次數(m <= n)近視為(12*ln2 / π2)*ln(n) 。(不知道怎麼證明的-_-!) 擴充歐幾裡德演算法 設gcd(a, b) = d,則存在正整數x, y滿足ax + by = d。演算法架構int x, y;int
Time of Update: 2018-12-06
妹的!java些高精度相當與玩cs開外掛!電腦裝上java很久了,一直只會寫寫a + b 玩,今天心血來潮找個高精度來玩玩。^ ^import java.io.*;import java.util.*;import java.math.*;public class Main { public static void main(String [] args) throws IOException { Scanner cin = new Scanner (new
Time of Update: 2018-12-06
代碼+注釋:#include <stdio.h>#define N 10000int num[N], a[N];void heap_adjust(int x, int y){int i = x, tmp = num[x];int j = i<<1; //j左移一位,即i*2 while(j <= y) //當未超過堆底時 {if(j < y && num[j+1] < num[j]) j++;
Time of Update: 2018-12-06
錯過了。。。當練習做的。250pt 略 500pt怎麼開始就沒敢寫暴力呢。。。。看別人的思路,挺巧妙的。Orzclass ColorfulChocolates {public: int maximumSpread(string c, int m) { int l = c.length(), i, j, num, cnt; int s[3000]; int sum, ans = 0, res; REP(i, l) {
Time of Update: 2018-12-06
又是產生樹問題。。。次小產生樹,顧名思義就是比最小稍微大那麼一點點的產生樹,^_^方法是:1、找到最小產生樹,值為mst2、最小產生樹種的點:找到每一個點到其它點的路徑上的最大邊權值 dp[i][j]表示i到j路徑上的最大邊權值3、加一條不在最小產生樹上的邊。比如i - k,同時刪除在最小產生樹上i -> k路徑上最大的一個邊權值dp[i][k]; 這樣會得到 new_mst,在這些new_mst中找一個最小的,就是次小產生樹的值實現上用到一些技巧,代碼如下POJ
Time of Update: 2018-12-06
詳見:隨機平衡二叉尋找樹Treap的分析與應用 #include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#define CL(arr, val) memset(arr, val, sizeof(arr))#define REP(i, n) for(i = 0; i < n;
Time of Update: 2018-12-06
/*題意很清楚。思路大概是:設dp[i]表示sum(s[x]) = i 時dp[i] = sum(f[x])取到最大。所得的i + dp[i]就是結果。因為s[i]有負的。所以0座標位置移動一下。dp[i]初始化為 -∞。0坐標位置為dp[MID] = 0;*///主要代碼:for(i = 0; i < n; i++) {if(s[i] <= 0 && f[i] <= 0) continue;if(s[i] > 0) {for(j = M; j
Time of Update: 2018-12-06
文章目錄 鴿巢定理的簡單形式鴿巢原理的加強形式 鴿巢定理的簡單形式 鴿巢原理(抽屜原理):如果有n+1個鴿子要進n個鴿巢,則至少存在一個鴿巢種包含兩個或更多的鴿子。看上去是一句“廢話”,不過這句”廢話“在用來證明一個排列或則某種現象的存在性上相當有魅力!關於鴿巢原理更抽象的表述:• If X has more elements than Y, then f is not one-to-one.• If X and Y have the
Time of Update: 2018-12-06
大概的思路是線封死一條邊i -> j,再找i到j的最短路dis[i][j]。dis[i][j] + w[i][j]就是一個環。找到所有環裡的最小值就能得到最小環。不過。。。用dijkstra算單源最短路的話,這個的時間雜度是O(n^4);所以可以用floyd將時間複雜度控制在O(n^3)上。思路是在floyd演算法進行鬆弛的時候就找這個最小環。ans = min(ans, dis[i][j] + w[i][k] + w[k][j]); 這樣 k -> i - >....
Time of Update: 2018-12-06
uestc的題。。。果然,題意都弄得這麼晦澀。01推個規律,mod r。偶推錯了。。。1個小時才過。06三分做的。還是不知道怎麼證明他是凹函數,話說。。以為神人想當然的說這是凹函數。。。怎麼證明?管他呢,真沒勁!08話說偶已經推出來s1的和sum1,s2的和sum2。sum1 -
Time of Update: 2018-12-06
二分圖: 二分圖G指的是一種圖,其所有的定點分成兩個集合X 和 Y,其中X或Y在各自集合種的任意兩個點都不相連,而分別在X 和Y 種的兩個定點可以構成邊。 X = {1, 2, 3} Y = {4, 5, 6, 7}圖可以表示為 G = (V, E), 其中 V = X υ Y。 匹配: 二分圖G的匹配M 是指邊集合E的子集M,
Time of Update: 2018-12-06
最優合并問題Time Limit:1000MS Memory Limit:65536KTotal Submit:19 Accepted:8Description給定k 個排好序的序列s1 , s2,……, sk , 用2 路合并演算法將這k 個序列合并成一個序列。假設所採用的2 路合并演算法合并2 個長度分別為m和n的序列需要m + n