Time of Update: 2018-12-05
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>char words[5000][500];char output[5000][500];char temp[500];int a, time;void deal( ){int i, j, start, flag;a = 0; start = 0;for( i = 0; i < time; i++
Time of Update: 2018-12-05
Bell-man演算法和Dijkstra演算法都是最短路徑的演算法,都可以用於求,單源點最短路徑的問題,那麼它們的區別在於什麼呢?想了很久,該怎樣去總結它們的區別,最後我認為從兩方面總結,是比較合適的:用途特性,演算法本身的區別。那麼演算法適用於什麼樣的情況,應該是有演算法本身的特性來決定的,所以,演算法本身的區別是關鍵,下面就來說明兩個演算法各自最核心的部分:Dijkstra:1. 初始化:將d[ ] 全部設為INF,特別的是d[s] = 0;將標記數組vis[ ]
Time of Update: 2018-12-05
題目連結//2013-05-17-21.08#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn = 100004;int dp[maxn][12];int main(){ int n, maxt, t, x; int tmax; while(scanf("%d", &n) && n)
Time of Update: 2018-12-05
還可以用kruskal演算法,將排序之後的邊,一一插入,這樣由於邊都是從小到大排序的,所以當前插入的邊就是這條路徑上的最大邊參考部落格http://blog.csdn.net/goomaple/article/details/8155095for(int i=0; i<q; i++) { val = -1; scanf("%d%d", &x, &y); Kruskal();
Time of Update: 2018-12-05
題目連結 這兩個題目是一樣的,大概題意是有3個操作 add x, 在集合中加入x, del x 是刪除x, sum 是求出由小到大排序後所有下標mod5等於3的數的和。 這個在hdoj上面,這個題給的時間比較多10s,我用了stl 裡的vector和 lower_bound, lower_bound 它的作用是返回不小於x的第一個數的位置,這樣我們每次插入後就能保證他有序。
Time of Update: 2018-12-05
這道題只要好好分析,就很簡單代碼如下://C//by Molly#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;int N = 100010;ll n, m, p;int main(){ while ( scanf("%d", &n) != EOF ) { ll ma[N];
Time of Update: 2018-12-05
POJ2352 Stars題目: 在平面直角座標系中, 給定n個點的座標, 每個點都有一個等級, 這個等級就等於這個點左下方的點的個數分析:換個說法來講, 就是求每個點的左下方共有多少個點。題目中,點的座標按照 Y
Time of Update: 2018-12-05
題目可以去CF找,這裡就不再敘述了分析過程:如果是偶數,那麼直接等於除以2,如: f(8) = f(4) = f(2) = f(1)如果是奇數,那麼直接等於除以2之後在加1,如:f(1) = f(0) + 1 = 0 + 1 = 1可以證明,左右數字都能經過不斷地除以2,最後得到式子:f(0) + x =
Time of Update: 2018-12-05
樹狀數組首先是用來求和的, 但是這個和的具體意義不同,樹狀數組解決的問題就不同。我做的第一道樹狀數組的題是POJ2299 Ultra--QuickSert ,這道題是求,要將一個序列非降序排列,需要做多少次交換。而實際上就是求逆序數。求逆序數是一維樹狀數組的一個重要應用,POJ3067 Japan也是一個求逆序數的題,還有POJ2481Cow
Time of Update: 2018-12-05
首先要說,寫代碼,要仔細;其次要說,在poj,當保證了自己代碼和演算法幾乎沒錯誤,思路也正確的時候,還逾時,檢查一下你提交的編譯類型是不是G++或者是GCC,如果是,改成C++試試!這道題很典型的2-sat!關於這個道題,網上已經有很多解釋了,在這裡不再贅述!代碼如下:(個人認為,tarjan比那個konaba……的演算法更簡單一些)#include <cstdio>#include <algorithm>#include
Time of Update: 2018-12-05
思路是參考大神的,我就不說什麼了,其實看代碼很明白,但是自己想就不一定能想出來,還是缺乏思維鍛煉啊。。。二分的時候一定要注意下表和數組界限的關係,保證每次都是均分,有時候資料過了只是表面現象。#include <iostream>#include <cstring>#include <cstdio>#include <stdio.h>#include <string.h>#define MAX 10010using namespace
Time of Update: 2018-12-05
這道題剛開始讀錯了題目,以為是每層有兩個門,後來再仔細看,還好,是一個門,那麼就是比較簡單的也是比較典型的2-sat了!首先,先總結一下2-sat的解題思路:根據我做的比較有限的題目,就是感覺一定要去找條件,找矛盾!有的題目是要求最優解,所以要結合條件來建圖,然後用2-sat判定可行性,用二分來找最優解!有的題目比較簡單就是直接判斷是否解。此外,還有要輸出最優解的情況,這個我還沒有做到輸出方案的題目,據說是要縮點,形成一個SCC圖。接下來,說一下這道題:第一,每個對鑰匙之間是有關係的第二,每個門
Time of Update: 2018-12-05
這道題有很多人用的是KMP的演算法,據說KMP的時間複雜度是O(n*logn),但是用Manacher,就是O(n), 所以力挺MANA這裡面和正常求最長迴文串不同的是,這個迴文串要前半部分單調遞增,當然,由於對稱性,後半部分單調遞減!那麼就要在原來的基礎上,加上幾個判斷,保證迴文串是滿足以上要求的。首先說,最右側在sign的位置,那麼一定是要將最長迴文串長度加1的,這是顯而易見的,對稱嘛;其次說,如果是在迴文串資料的位置,就要在最右面或最左邊,減2或加2來對比是不是滿足要求。而這裡有兩種可能,
Time of Update: 2018-12-05
題目:Description今天是小雲的生日,小塘給小雲送來了一些糖果。糖果裝在一個連成一排的紙格子中(一個格子中可能有多個糖果),不過在路上小塘掉了一些,所以有的紙格子是空的。小雲看到送來的糖果頓時就驚呆了,太多了,一下子肯定吃不完。由於紙格子沒有蓋子,這時小雲的爸爸就要小雲按照他的要求用紙片把紙格子蓋好(空格子沒有糖果,所以能不蓋就不蓋咯),以免裡面的糖果受潮。他說:“小雲,我給你一定數量的紙片,紙片的數量是固定的,但是長度可以隨你自己來定,你告訴我用這個數量的紙片去蓋住糖果,所用的紙片的最
Time of Update: 2018-12-05
和之前的類似,以後這樣的題目要秒殺!還有wa了一次,問題是i和1我總是打錯,以後一定要注意;還有能有printf的就不要用cout了,流還是比較費時的代碼如下:#include <cstdio>#include <iostream>#include <string>#include <algorithm>using namespace std;string s, str;int Maxid, Maxl, id, p[2000020];void
Time of Update: 2018-12-05
今天主要是給MTS做了一個準備,重點學習了並查集。什麼是並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合(Disjoint Sets)的合并及查詢問題。常常在使用中以森林來表示。(摘自百度百科)並查集中,每個集合裡的元素一般都是有某種關係的,比如串連關係:假設最初a, b 和 c 都是獨立的點,後來a 與 b 相連,b又 與 c 相連,那麼我們說a 可以到 c,相當於a 與 c相連,我們可以把a, b 和c放到一個集合裡去,也就是將三個集合合并;再假設有,a 和 b組成集合A,
Time of Update: 2018-12-05
HOJ 2275(水題)題目:計算序列 a[] 中, 當 i < j < k, a[i] < a[j] > a[k], 這樣的三元組的個數。分析:首先, 我們可以以中間的數字a【j】 為中間點,計算當前它前面比它小的有多少個點,以及比它大的有多少點;建樹完畢時,即所有的點都被插入的時候,我們再求在此點插入之後,有多少個比他大的點被插入(和之前的求差就行)。代碼如下:#include <cstdio>#include
Time of Update: 2018-12-05
這裡面讀題一定要精準,首先它說的是從一個string裡面take away一些字元,使得剩下的字元成為一個palindrome,這裡求的是palindrome的最大長度,那麼也就是說刪除最少的字元使得這個string成為一個palindrome,並且可是在原串不連續的。那麼這個道題和之前做的longest
Time of Update: 2018-12-05
在這裡, 我們把圖分為兩類:有向圖和無向圖對於求最小產生樹,有向圖和無向圖的做法也是不一樣的。解決無向圖的演算法,主要是有兩個:prim和kruskal, 其中,prim用於稠密圖,kruskal用於稀疏圖。解決有向圖的演算法,目前我知道的就是最小樹形圖。首先,我們對prim進行一下簡述:1、集合M, N:M的初始狀態是圖中所有點,N為空白;2、在圖中任選一個點,加入N,並從M中刪除;3、在M中找出一個點,它到N中某一點的距離小於M中其他的點到N中任意一個點的距離,將這點加入N,並從M中刪除;4
Time of Update: 2018-12-05
要解這道題,一定要明白next數組每次如果不匹配一次向前找的原理。如1:這裡面,假設這個線段是一個字串,那麼下面我們來說一下,為什麼一直取next就可以找到找到next的值。首先我假設我們從第三段最後一個位置發現s[j] != s[k]了,那麼我們只清楚的是的前一個是指向粉色線段的末尾的,那麼也就是說粉色線段和紅色的線區段標記的這兩段字串是相等的。當發生s[j]和s[k]不等的時,k要向前尋找,假設這時,next[k]的值恰好指向了第一藍色線段的末尾,那麼也就是說前兩個藍色線段相等,