看到範圍一開始猜是矩陣快速冪,開始推按列轉移的dp,正方形之間有交集很差轉移。優化
換了個角度,都剛好有c個,那麼我在滑動正方形的時候損失幾個就要得到幾個,而後就看出了列之間的相等關係。ui
推了個$\Theta(n^4logm)$的dp。碼完測了下n=50都T飛,懷疑人生10min,發現k沒限制n打成了$\Theta(n^5logm)$spa
改完發現100依然T飛,而後慌了(由於懊悔T3是原題但我沒學回滾莫隊...),忘記當時爲何覺得log提不出來了orz。code
打完dp,觀察複雜度瓶頸,首先考慮優化而不是換思路。blog
預處理快速冪,2s 1e8可過。排序
看錯題了,覺得是大水題。class
倒序掃描,用單調遞減棧維護右端點(若是有i破壞單調性,那麼因爲i的存在,被pop的元素不可能再成爲右端點),考慮如何快速獲得最左合法左端點。di
維護pos[],mn[],表示單調棧中相鄰元素在序列上下標的左閉右開區間中的合法左端點位置及值(即mn<=區間中pos右邊的全部數)。ant
在彈棧的過程當中取最小mn[]才能更新答案。分類討論維護pos[i]和mn[i]。co
一眼permu,上來直接打,算複雜度忘算logn。$\Theta(n\sqrt{n}logn)$
碼完測10wT飛,極限6w。發現5e8 3s肝不過,又想起permu非權值線段樹打法,wsl。
正解:回滾莫隊
發現答案的更新來自與邊緣的合併,因此只要維護L[i]表示<=i的最長連續值域長度,R[]同理。
每次更新的時候更新答案、維護邊緣的信息。
1 L[a[r]]=L[a[r]-1]+1; 2 R[a[r]]=R[a[r]+1]+1; 3 int tmp=L[a[r]]+R[a[r]]-1; 4 mxr=max(mxr,tmp); 5 L[a[r]+R[a[r]]-1]=tmp; 6 R[a[r]-L[a[r]]+1]=tmp;
以上「加」的操做是$\Theta(1)$的,然而沒法隨意撤回。
相似Dash Speed,若是咱們能保證一個有序的撤回的「深度」合法的處理順序,那麼就能夠用棧記錄並暴力撤回。
一樣的排序(不能奇偶優化)。
對於每一個詢問,右端點遞增,不須要撤回。處理並記錄左端點在塊內的操做,更新答案而後撤回,塊長是$\sqrt{n}$,因此撤銷的複雜度爲$\Theta(q \sqrt{n})$