原创 CF392E Deleting Substrings(區間dp)

題意就是說給你一個序列a,你每次可以選擇一段“山峯形”子串刪掉,獲得v[長度]的價值,價值可能爲負。可以不全刪掉,求最大價值。 f[i][j] 把i~j都刪掉的最大價值 g[i][j] 把i~j刪成a[i],a[i]+1,…,

原创 bzoj4650 [Noi2016]優秀的拆分(計數+SA)

好久沒寫SA了的趕腳qaq 考試時寫了95分的O(n2)O(n2) 暴力hash 我們考慮枚舉中間分割點i,以i結尾的AA串個數*以i+1開頭的AA串個數就是對答案的貢獻。 於是我們只需要處理出f[i],以i結尾的AA串個數 g

原创 bzoj4199 [Noi2015]品酒大會(SAM+線段樹)

這回換了個SAM寫,SA的做法見:portal 一開始以爲可以做到線性…結果寫了之後發現還是要掛棵線段樹… 我們考慮對反串建SAM,搞出後綴樹,這樣任意兩個後綴的lca就是他們的lcp。於是我們可以在每個lca處統計答案。 不

原创 bzoj1670 [Usaco2006 Oct]Building the Moat(凸包)

求凸包裸題。用的是Graham掃描法求凸包。 a×b>0a×b>0 說明向量b在向量a的逆時針方向上。 我們一開始極角排序就是要把這些點與點1的連線逆時針排序。 然後按順序處理這些點,維護一個棧,使得相鄰點之間的線段都是逆

原创 bzoj2216 [Poi2011]Lightning Conductor(決策單調性+分治/二分+單調棧)

化簡一下就是求ans[i]=max{aj+|i−j|−−−−−√}−a[i]ans[i]=max{aj+|i−j|}−a[i] 我們把絕對值去掉,正着倒着各做一遍即可。 現在只考慮<i<i 的jj 設k1<k2<ik1<k2<i

原创 bzoj4946 [Noi2017]蔬菜(模擬費用流,貪心,線段樹)

首先我們有一個費用流的做法。 因爲保質期這個東西不太好限制,我們把每種蔬菜都按照過期時間分成若干類,每類大概x個,這樣就相當於我們有了n*p種蔬菜。每種蔬菜在指定時間過期。我們把S的獎勵放到每一種蔬菜過期時間最晚的那一類中去。

原创 bzoj4184 shallot(線段樹時間分治+線性基)

我們按時間建線段樹,把所有數的存在時間求出來,一定是一個連續的區間,插到線段樹對應區間上。線段樹每個節點掛一個vector來存數。這樣就把刪除操作避免掉了。然後從上到下dfs一遍線段樹,把每個葉子的線性基合併出來即可,複雜度O(n

原创 bzoj4198 [Noi2015]荷馬史詩(Huffman編碼+stl)

題目給出的定義顯然就是讓我們求Huffman編碼。 不過可能是K叉的,我們加幾個0補全就好了。 爲了滿足第二個要求,貪心的權值相同時深度小的優先。 #include <bits/stdc++.h> using namespac

原创 bzoj2300 [HAOI2011]防線修建(動態維護凸包)

把操作離線,倒着做,這樣就是加點維護凸包了。 可以用set維護一下當前凸包上的點 然後每次新加一個點時判斷是在凸包內還是凸包外 如果在凸包外,就要重新維護上凸殼,往兩邊刪點,直到再次構成凸殼。 O(nlogn)O(nlog

原创 bzoj4943 [Noi2017]蚯蚓(Hash+複雜度分析卡常)

做法較爲明顯,直接模擬即可。Hash比較字符串。 複雜度分析一波,如果沒有2操作的話,複雜度顯然是O(nk)O(nk) 的,考慮有2操作的話,分裂兩個蚯蚓的複雜度是O(k2)O(k2) ,因此而帶來的合併複雜度也是O(ck2)O

原创 CF607B Zuma(區間dp)

給定一個序列,每次操作可以選擇一個迴文子串刪掉,問把整個序列刪除所需的最小操作次數。我們區間dp,f[i][j]表示把i~j都刪掉的最小花費 轉移有兩種: 1、i,j沒有在一次被刪掉,f[i][j]=f[i][k]+f[k+1

原创 bzoj4742 [Usaco2016 Dec]Team Building(dp)

把所有牛一起降序排序,權值相同的FP的在前。 然後直接dp就好了,f[i][j][k],考慮前i頭牛,FJ已經選了j頭,FP已經選了k頭的方案數,要求k<=j #include <bits/stdc++.h> using na

原创 bzoj4944 [Noi2017]泳池(dp,概率與期望)

首先把求最大面積恰爲K的概率轉化成 求最大面積<=K的概率-最大面積<=K-1的概率 我們注意到最底層一定是選了若干段<=K的連續段,於是我們可以枚舉連續段的長度來dp。 我們考慮f[i][j]f[i][j] 表示底邊長爲i,且

原创 CF346B Lucky Common Subsequence(LCS+kmp)

給定三個串A,B,C,求串A,B的lcs,要求不能包含C串作爲子串。 f[i][j][k]表示A串前i個,B串前j個,lcs匹配到了C串的第K的個字母的lcs 轉移和普通的lcs差不多,就是在往lcs上多加一個字符時,需要求一

原创 poj2318 TOYS(計算幾何)

那些年不想寫的計算幾何,總有一天要還。 直接枚舉點,枚舉四邊形即可,只要用叉乘判斷點是否在兩條線段中間即可。 O(nm)O(nm)O(nm) #include <cstdio> #include <cstring> #includ