Codeforces #471
C(分段)
題意:
分析:
我們分別考慮p=2和p>=3的情況
當p=2的時候,個數明顯是[L,R]內完全平方數的個數
當p>=3的時候,我們注意到這樣的數字個數是1e6級別的,且a最多也不超過1e6
我們可以對于每個a去枚舉對應的p,然后丟到一個set里去重
還有一點要注意的,p=2可能會和p>=3的情況重復,所以我們還要從set里去除所有的完全平方數
于是對于每個詢問就在我們構造出的set里二分+[l,r]內完全平方數的個數
D(擴展kmp)
題意:
給出一個長度為n的字符串s,一個長度為m的字符串t。n>=m
輸入一個整數k,你需要從字符串s中拿出兩個不重合的長度為k的子串并拼接起來形成一個長度為2k的字符串f
請問是否存在一種取法使得t是字符串f的子串?
n,m,k<=5e5
分析:
我們來枚舉字符串t的前綴,把這個前綴作為第一個切片的后綴,把t的對應后綴作為第二個切片的前綴,看看是否可行
為了讓兩個切片不相交,我們肯定想讓第一個切片盡量靠左,第二個切片盡量靠右
我們注意到處理右邊切片和處理左邊切片恰好是對稱的,這個我們只需要把字符串逆序再同樣的做法求就行了,所以我們不妨就只討論處理左切片
現在問題就變成了:在原串s中尋找一個盡量靠左的長度為k的子串,這個子串的長度為i的后綴恰好是pret[i]
我們可以用exkmp預處理求出extend[i]表示s[i..n-1]與t的最長公共前綴,那么對于每個i,本質上就是找到最小的j使得extend[j]>=i且j>k-i
我們可以從小到大枚舉i,用一個set去維護滿足extend[]>=i的所有下標就行了
時間復雜度O(nlogn)
E(去絕對值)
題意:
給定長度為n的數組a[i],你需要自己決定一個T,1<=T<=n,那么b[i]=a[i]+|T-i|
b[i]表示b[i]秒后位置i上空的冰錐就會掉落到底面,你就無法通過該位置了
現在有一個人從左邊位置1向右邊跑,如果某一時刻,該人前面的位置中有冰錐掉下來了,并且后面的位置中也有冰錐掉了下來,那么他就被困住了。
現在你需要定一個T,使得該人被困住的時刻盡量早。
如果不存在這樣的T,那么輸出-1
n<=1e5
分析:
最簡單的想法就是枚舉所有的T,然后求出該人被困住的時刻,取個最小值就行了
假設現在我們枚舉了一個T,那么b[i]就已經確定了,我們先來看個簡單的問題,就是如何判斷該人是否會被困住
被困住的話,那么就是一定會存在一個i,使得b[i]<i,我們找一個滿足條件的最小的i,那么該人就在i前面被擋住了不能再跑了(但要注意一點,就是有可能后面某個冰錐很早就掉下來了,他前方其實早就被封住了)
然后這個時候的答案還需要等他后方最早的冰錐掉落
所以該情況下的困住時刻是max(min(b[1..i-1]),min(b[i+1..n]))
這樣還是O(n^2)的,我們得優化我們的判定
我們把b[i]中的絕對值去掉,那么就是
b[i]=a[i]+T-i? ?(i<=T)
b[i]=a[i]+i-T? ?(i>T)
我們可以考慮分類討論兩種情況下滿足b[i]<i的最小的i是誰,這個東西的處理和D題的是一樣的,用一個set來維護就行了
找到這個分界點i之后,問題就是對前半部分取min,對后半部分取min
我們注意到每次T的遞增只是使得整體的一段+1,一段-1,然后我們需要求區間最小值,那么這用線段樹就解決了
時間復雜度O(nlogn)
F(dp計數)
題意:
給出一個n點的有根樹,根是1。
dp[u][k]表示在以u為根的子樹里,我們需要去尋找一個子圖,它是一個滿k叉樹,并且這個子圖的深度最大,dp[u][k]就是這樣的最大深度
我們需要對所有1<=u<=n,1<=k<=n的dp[u][k]去求和,將結果輸出
n<=3e5
分析:
我們如果按照題目的這樣去設計狀態,那么狀態就直接爆炸了,更不需要提轉移了
我們把問題分成k=1和k>=2,k=1的情況直接樹形dp就行了
對于k>=2的情況,我們發現所有dp[u][k]中有很多數字都是重復的且連續的,因為深度不可能會很大,最多是20
于是我們可以反過來設計狀態,dp[u][dep]表示以u為根的深度為dep的子樹,最大的k值是多少(因為如果存在深度為dep的k叉樹,那么一定存在深度為dep的k-1叉樹)
這樣狀態數就是O(nlogn)了,我們再來考慮轉移
考慮枚舉dep,然后就是dp[v][dep]轉移到dp[u][dep]
很明顯是我們對所有的dp[v][dep]從大到小排序,然后去找個最大的k滿足a[k]>=k,這個我們直接sort暴力
復雜度是O(nlog^2n)的
?
轉載于:https://www.cnblogs.com/wmrv587/p/8687179.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Codeforces #471的全部內容,希望文章能夠幫你解決所遇到的問題。