日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces #471

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。