原创 Continuous Intervals【單調棧】【合法區間計數】

題目鏈接:https://nanti.jisuanke.com/t/41296 從左到右枚舉右端點,然後求合法的左端點的個數。 用max表示區間最大值,min表示區間最小值,cnt表示區間不同數的個數。 合法需要滿足max-min-cnt

原创 Indie Album【AC自動機】

題目鏈接:https://codeforces.com/contest/1207/problem/G 首先對於模式串建立AC自動機,然後對文本串建立字典樹。考慮在字典樹上一邊dfs,一邊維護AC自動機上每個點的成功匹配次數。 而AC自動機

原创 Robots【2019南京網絡賽】【DAG圖上概率】

題目鏈接:https://nanti.jisuanke.com/t/41301 設day[i]表示以i爲起點到終點的期望天數。 設ans[i]表示以i爲起點到終點的期望得分。 顯然day特別好求,然後考慮如何借用day去得到ans,這也沒

原创 CCPC2019網絡賽 array【後綴數組】【主席樹】【線段樹上二分】

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6703 #include <bits/stdc++.h> #define rep(i, a, b) for(int i = (a); i <

原创 Candies 【後綴數組】【主席樹】

題目鏈接:https://vjudge.net/problem/Gym-102302K 前置技能:後綴數組處理本質不同的字串。 #include <bits/stdc++.h> #define rep(i, a, b) for(int

原创 最長道路tree【點分治】

題目鏈接:https://ruanx.pw/bzojch/p/2870.html?tdsourcetag=s_pcqq_aiomsg 用map記錄子樹中每個最小路徑長度的最大邊長,定義map從大到小排序,然後用雙指針的方法進行路徑合併。

原创 Make Rounddog Happy【序列分治+DP】

DP維護從某點 往後/往前 遇到的第一對非法點對。 然後分治計數,合併的時候根據最大值是 由左區間貢獻還是右區間貢獻 來進行分類,注意去重。 可以枚舉左/右區間端點,這樣即能固定最大值也能固定剩餘區間的長度。 複雜度O(NlogN) #

原创 [Jsoi2009]有趣的遊戲【概率DP】【AC自動機+高斯消元】

題目鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=1444 首先構建AC自動機。 然後問題就變成了經典問題: 給一個有環圖,0號點爲起點,每條邊有一定的概率去走,有若干個終點,到達

原创 Acesrc and Travel【換根樹dp】

考慮固定根(起點)情況下的最優解,可以用dp容易求出。 考慮換根操作,假設當前根爲u,需要換成v。(v是以1爲根情況下u的子節點) 那麼需要保證v->u後,u不能再返回v,所以需要記錄最優值和次優值。 當發現u的最優值不經過v,用最優值對

原创 Coprimes(從 i 位置往後第一個與其互質的數的位置)

 bitset維護每個質因子出現的位置 從後往前跑,每次找到一個位置使該數的所有質因子都沒有出現過。 把該數的所有質因子的bitset或起來,然後找從當前位置往後的第一個0位置。 取反後用bitset的_Find_first函數可以解決。

原创 數字梯形問題【網絡流24題】【費用流】

題目鏈接:https://www.luogu.org/problem/P4013 對於第一問 把一個點拆成入點和出點,從入點到出點連一條容量1,費用0的邊,表示每個點最多隻能經過一次。 從S連向第一層的各點的入點,容量1,費用爲負的點權。

原创 A+B>=K(?????)

A 的取值範圍 [l1,r1], B 的取值範圍[l2,r2]。 問有多少種取值方案滿足A+B>=K。 時間複雜度O(1) 用對拍稍微驗證了一下代碼的正確性 ll nb(ll l1,ll r1,ll l2,ll r2,ll k) {

原创 聰聰可可【點分治】

模板題 題目鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=2152 求長度爲3的倍數的路徑條數 #include <bits/stdc++.h> #include <ext/pb

原创 圓桌問題【網絡流24題】

 題目鏈接:https://www.luogu.org/problem/P3254 二分圖最大流 然後看一下殘留網絡就行了 #include <bits/stdc++.h> #define rep(i, a, b) for(int i

原创 Floyd求最小環模板

  int val[maxn + 1][maxn + 1]; // 原圖的鄰接矩陣 inline int floyd(const int &n) { static int dis[maxn + 1][maxn + 1]; //