原创 Pty的字符串(string)

解法 SAM: 首先用trie樹建sam,和一般的sam不同的地方在於轉移的位置不再是直接用ed,而是根據該節點在trie樹上的祖先。 然後就是跑LCP操作,統計答案。統計答案時需要計算每個節點所代表的字符串數量val[i]和從

原创 一道區間dp題

題意 你有一個有序的數組,現在要插入一個新的數,相信你一定學過二分查找,也知道最壞情況下需要比較幾次才能找到新的數該插入什麼位置,但是現在,我們稍微改變下套路,把新的數與數組中的每一個數比較都會有一個特定的代價,代價在1-9之間,

原创 codeforces 1083E

luogu鏈接 解法 首先可以觀察到所有矩形排成了類似樓梯的形狀,所以如果對x排序,y也是有序的。 先按x從小到大排序 然後考慮dp:f[i]表示最後一個矩形選擇的是第i個的最大價值f[i]表示最後一個矩形選擇的是第i個的最大價值

原创 codeforces 1338C

luogu鏈接 吐槽:賽後10min就寫出來了。。。一開始把打表程序寫錯了導致規律找錯了。。。 解法 首先打表找規律,發現和4的倍數有關,然後分n%3的值討論。 n  mod  3==1n ~~mod~~3==1n  mod  3

原创 luogu 4917

題目鏈接 解法 首先觀察一下,可以發現對於a,b,正方形的邊長是lcm(a,b)。那麼買的地板的數量是(a∗b)gcd(a,b)2\frac{(a*b)}{gcd(a,b)^2}gcd(a,b)2(a∗b)​ 那麼對於一個n的答案

原创 AGC030F

luogu鏈接 解法 考慮如果A中的兩個相鄰位置都確定了的話,這兩個位置所對應的B的位置不會對B的方案產生影響,直接不管就可以了。 如果建立圖論模型,可以發現B的每一個數相當於對A中的兩個數匹配後,較小的值 然後記錄每個數是否在A

原创 codeforces 704B

luogu鏈接 解法 高妙的dp: 首先調整一下權值: ai=ai+xi,bi=bi−xi,ci=ci+xi,di=di−xia_i=a_i+x_i,b_i=b_i-x_i,c_i=c_i+x_i,d_i=d_i-x_iai​=a

原创 codeforces 605E

luogu鏈接 解法 (好像在哪裏見過幾乎一樣的問題?) 考慮這種圖上的期望一般倒着算,所以可以從終點反推回起點。 然後考慮我們更新點到終點的距離的過程,我們每次選出一個目前到終點距離最近的點,用它去更新和它相鄰的點的距離,這個是

原创 codeforces 671D

luogu鏈接 解法 設f[i]表示覆蓋了i的子樹和i的返祖邊的最小代價,那麼答案就是∑i∈son[1]f[i]\sum_{i\in son[1]} f[i]∑i∈son[1]​f[i],但是f[i]的方案不一定是最終的最優方案,

原创 luogu P4196

題目鏈接 題意 給一些多邊形,求這些多邊形的面積並 數據範圍 每個多邊形至多50條邊,至多有10個多邊形 解法 半平面交 這裏介紹的是O(nlogn)O(nlogn)O(nlogn)的做法: 首先考慮如何比較優秀的直線求交,這個是

原创 codeforces 1280D

題目鏈接 題意 給一棵樹,樹上每個點有兩個權值,分別是wi,bi 要求將樹分成m個聯通塊,要求最多能有幾個聯通塊內的∑wi>∑bi\sum wi \gt \sum bi∑wi>∑bi 數據範圍 多組數據,組數<=100 n,m<=

原创 noi.ac 12

orz zhf 題目鏈接 題意 有n個病毒,每天每個病毒的體積會變大ai,每天必須且只能消除一個病毒,代價是病毒的體積,每個病毒的初始體積是bi,天數一共有k天,問最小的代價是多少。 數據範圍 n,k,ai≤106,bi≤1011

原创 一道sam練習題

題意 解法 考慮答案實際上是每個子串的出現次數的平方和. 這個可以通過手玩樣例驗證. 考慮廣義sam:先將所有字符串建成trie,然後再在trie上bfs,建出sam. 考慮fail樹 每次插入一個新節點,會改變從這個節點開

原创 noi.ac 767

orz zhf 題目鏈接 解法 首先把問題方向轉化一下,變成考慮每個點的貢獻,這樣就是考慮每個點左邊m個比它大的數的位置,右邊m個比它大的數的位置,有了這些數據就可以稍微推一下式子算出這個點一共在多少個區間中產生了貢獻。 然後首先

原创 codeforces 1252L

題目鏈接 orz zhf 題意 有n個節點每個點有一條出邊,保證這些出邊把圖聯通,這條出邊可以用mim_imi​種材料建造,這些材料讀入,然後有k個工人,每個工人能夠使用一種材料,這個也是讀入的,問有沒有合理分配工人,建邊的方法,