Time of Update: 2018-12-03
人生第一次300行代碼,嘔心瀝血啊。。果斷留帖紀念下debug一天,結果是線段樹沒有初始化。。對代碼的每一個部分如果沒有仔細檢查過,就不應該有盲目的自信。T_T思路還是寫一下好了,雖然不是自己的東西。。:節點數有10W,詢問數有10W,顯然對於每一個節點都搜一次必然要逾時。注意到每次詢問的終點都在同一層,那麼是不是可以通過維護每一層的最值來達到快速詢問的目的呢。我們可以按照DFS的順序對節點進行編號,那麼一個節點的子節點的編號必然都在這個節點和這個節點的兄弟節點之間,通過這個性質,我們再對每個節
Time of Update: 2018-12-03
題意: 給出一棵樹,邊長度皆為1,問距離為k的點對有多少組,相同點對算一組。解法: 設dp[u][i]為以u為根的子樹中與u的距離為i的點有多少,DFS一遍即可。#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;#define REP(i,a,b) for(int i=(a); i<(b);
Time of Update: 2018-12-03
樹形DP+背包題意:給一棵樹,每個點有相應的價值,要求從節點1開始走最多k步,問能取得的最大價值。重複經過的點不算。分析:這題的特點是走到葉子節點後回返也需要消耗步數。思路:設狀態g[i][j]表示以i為根的子樹走j步不回到根的最大價值,狀態b[i][j]表示以i為根的子樹走j步最後回到根的最大價值所以 b[u][i+j+2] = max(b[u][i+j+2],
Time of Update: 2018-12-03
從大到小排序可以減少耗時,從小到大會增加耗時;注意回溯 和 剪枝/* *HDU 1518 *fuqiang11 *DFS *2013/7/28*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 20+3int a[maxn];bool visit[maxn];int N,M,eva;
Time of Update: 2018-12-03
0-1背包問題。求第K大的值。http://acm.hdu.edu.cn/showproblem.php?pid=2639這道題目第一次做的時候是一場自己掛的WEB-DIY中的一題,那時候是直接開了一個一維的dp[ j ]數組,用來記錄獲得價值j最大的體積,然後轉化為簡單的0-1背包,,思路感覺很簡單,然後已提交,RE。傷了。後來才發現,最大價值可能要上億。。。囧了。恩,後來用一位元組來記錄。接著麼。。。#include <cstdio>#include
Time of Update: 2018-12-03
我知道,我現在寫這篇文章還很不成熟,因為我很多東西弄得還很不怎麼樣,但是我還是想寫一下。國家集訓隊論文中有大量關於DP最佳化的論文:毛子青的《動態規划算法的最佳化技巧》、朱晨光的《從《鷹蛋》一題淺析對動態規划算法的最佳化》、楊哲的《凸完全單調性的一個加強與應用》等。特別是毛子青大牛的論文,值得一看!還要說明的是,周源的《淺談數形結合思想在資訊學競賽中的應用》一文,談到了數形結合、單調隊列、和下凸折線上凸折線等,分析了斜率的最佳化策略。趙爽的《動態規劃加速原理之四邊形不等式》給出了四邊形不等式的證
Time of Update: 2018-12-03
題意: 略。解法: 把插座和源點建邊,插座和轉換器建邊,以需求為邊連匯點,求一遍最大流。在ZOJ詭異的PE之後,果斷把set換成手寫trie樹,還是PE。然後在POJ無壓力AC了。對ZOJ表示一下無奈。trie樹寫的有點弱,沒用指標最佳化,而且固定空間。第二發最大流,還是Frod-Fullkerson#include <algorithm>#include <string.h>#include <stdio.h>#include <ctype.h>
Time of Update: 2018-12-03
學長給的代碼:可作參考void pack01(int a, int b)//0 - 1 背包 {int i;for(i = Sum; i >= a; i ++)dp[i] = maxz(dp[i-a] + b, dp[i]);}void packcmp(int a, int b)//完全背包 {int i ;for(i = a; i <= Sum; i ++)dp[i] = maxz(dp[i-a] + b, dp[i]);}void packmul()//多重背包 {int i,
Time of Update: 2018-12-03
AC得很詭異,表示其實自己都沒有看懂。難道這就是Fleury演算法?有沒有路過的大神幫忙解釋下。#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;#define FOR(i,a,b) for(int i=(a); i<=(b); i++)#define REP(i,a,b) for(int i=(a); i<(b); i++)#define
Time of Update: 2018-12-03
http://acm.hdu.edu.cn/showproblem.php?pid=1455題意大概就是:有一堆的木棒,長度不一,它們是有一些整齊的木棒截斷而成的,求最小的整齊長度。額,這道題目第一次做的時候是在集訓前一天。那時候默默的用了自己學過的為數不多的演算法:貪心去做了這題。不出意外的WA了。囧了。過了10幾天后的今天突然又去看了這題,突然覺得可以使用這幾天在學的搜尋來做。然後,果斷的敲了一個DFS,,還是WA了,那時候感覺自己做的沒錯,然後就去請教隊長,隊長讓我去和那些AC的代碼資料對
Time of Update: 2018-12-03
POJ1273Drainage Ditches(網路最大流裸題)ISAP + 鄰接矩陣// Nero//鄰接矩陣#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define FOR(i,a,b) for(int i=(a); i<=(b); i++)#define REP(i,a,b) for(int i=(a); i<(b);
Time of Update: 2018-12-03
題意: 給平面上n個點(n<=16),問最少幾條線能把所有點覆蓋。解法: 16個點,又是在DP分類,沒怎麼想就是狀態壓縮DP了。先預先處理點兩兩之間組成的直線經過的點集line[i][j]。然後每次枚舉兩個點就可以了。#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define clr(a,b)
Time of Update: 2018-12-03
題意: 寫一段代碼代替以下的古老程式碼片段。long long data[250001];void A( int st, int nd ) { for( int i = st; i <= nd; i++ ) data[i] = data[i] + (i - st + 1);}void B( int st, int nd ) { for( int i = st; i <= nd; i++ ) data[i] = data[i] + (nd - i + 1);}void C(
Time of Update: 2018-12-03
Treap 模板題題意: 要求實現一種資料結構,支援:Insert: 插入原來不存在的元素。Remove: 刪除原來存在的元素。Kth: 詢問第K大的元素,詢問不合法(即k大於元素數量),輸出“invalid”。Count:詢問小於x的元素的數量。解法: Treap的基本操作全齊了,紅果果的裸題。訓練指南版#include <stdio.h>#include <string.h>#include <algorithm>#include
Time of Update: 2018-12-03
題意: 給一個長度n的1~n的排列,要求詢問一段區間內任意兩個數的最大公約數的最大值解法:
Time of Update: 2018-12-03
題意: 兩個人一起玩掃雷,都不點炸彈,誰先不能點誰就輸。問誰贏。解法:
Time of Update: 2018-12-03
題意:在一條直線上停車,要求新停入的車有最小前後距離限制(頭尾不算),支援停車和開走。思路:在直線頭尾加入一段虛擬長度,使頭尾部不用特殊處理,查詢時加入前後距離限制,增刪時只計原長。做完這題,對線段樹的理解又清晰了一些。目前遇到的基本都是點樹,每個節點維護的是點的數目。所以在詢問長度時,頭尾需要各縮減1,因為和其他區間相連處會有一個長度為1的半開區間部分,不需要計在節點數內。原來題目的操作2指的是開走第x個操作的車,在這裡WA了一次,蛋疼。題目的資料規模才100,暴力的話複雜度也就1e7。。是不
Time of Update: 2018-12-03
樹形DP題意:
Time of Update: 2018-12-03
樹形DP題意:給一棵樹,樹上的每個節點會有財富,某些節點會有陷阱,現在你可以從任意節點開始走,不能往回走,碰到第C個陷阱就停,問能獲得的最大價值。思路:開三維狀態,分別是【當前節點】【已經遇到的陷阱數】【是否從陷阱開始】,值表示從這個節點的子節點在相應情況下能取得的最大值。那麼最長的那條路必然是由兩棵子樹的最大值合并而成或者就是從這個節點到子樹的某處的價值。需要注意的是合并時候的情況。當遇到的陷阱樹小於C的時候,兩條子路可以任意取,而當遇到的陷阱數等於C的時候,只能是以一個陷阱處結束這種情況(當
Time of Update: 2018-12-03
區間劃分。本菜在這一題學到蠻多新東西&&新思想,下面詳細記錄一下思考過程。題意: 給出一幅圖,每個頂點有(1~n),有nq個詢問,問區間l~r的頂點集,在把l~r之外的所有點和邊刪掉之後,有幾個連通塊。解法: 分x個步驟慢慢來~1.區間劃分: 對於l~r的每一個區間詢問,最暴力的方法是從l到r一個一個的計算過去,複雜度為O(q*n),對於詢問數q=3w,區間長度n=3w的題,必須逾時,那麼考慮最佳化。對每一個詢問,我們考慮它們的lr區間的重疊部分(如果不重疊,那就是大水題O(n)