1. 程式人生 > >codeforces div.3 1005

codeforces div.3 1005

路徑 如何 是否 前綴 一位 最短 cas edit 和數

codeforces div.3 1005


C. Summarize to the Power of Two

  • 如果對於數組中的任意元素,在數組中都能夠找到一個其他的元素,這兩個數字的和是2的冪次。那麽這個數組被認為是合法的。現在,問,你至少要從這個數組中剔除多少元素,使得這個數組合法。
  • map。
  • 先把所有的元素扔到map裏,然後對於每個元素,枚舉2的冪次,尋找差值,看是否能夠找到。註意,如果一個元素找到的是他本身,例如8+8=16。這個時候要判斷8是否出現過大於1次。

D. Polycarp and Div 3

  • 給定一個數列,將他分割為一段一段的。問如何分割,能使他被3整除的段數最多。
  • 3|1|21 2|0|1|9|201|81
  • dp[i][j]代表到i這一位為止,最後的連續位模3余j的最大段數是多少。
    考慮第i位,如果這一位能夠被3整除,那麽dp[i][0]=max(dp[i-1][0],dp[i-1][1],dp[i-1][2])+1 dp[i][1]=0 dp[i][2]=0
    如果這一為模3余1,那麽dp[i][0]=max(dp[i-1][0],dp[i-1][2]+1) dp[i][1]=max(dp[i-1][0],dp[i-1][1],dp[i-1][2])
    dp[i][2]=dp[i-1][1]
    如果這一位模3余2,dp[i][0]=max(dp[i-1][0],dp[i-1][1]+1)
    dp[i][1]=dp[i-1][2] dp[i][2]=max(dp[i-1][0],dp[i-1][1],dp[i-1][2])

E1. Median on Segments (Permutations Edition)

  • 給定一個數組,數組是一個排列,給你一個數k,問在多少的區間裏,這個k是中位數。(如果是偶數長度,那麽k為第n/2個)
  • 給數組中的數打上標記,如果這個數>k,記為1,<k記為-1,k為0,計算前綴和。我們將k這個位置之前的數都加入到計數數組中,然後對於大於等於k的位置進行詢問。可以發現,在前綴和數組中,若sum[j]-sum[i]==0||sum[j]-sum[i]=1,則i,j的區間是合法的。O(n)查詢即可。

E2. Median on Segments (General Case Edition)

  • 給定一個數組,給你一個數k,問在多少的區間裏,這個k是中位數。(如果是偶數長度,那麽k為第n/2個)
  • 我們對<=k的標記為-1,大於k的標記為1。此時如果一個區間的和<=0,那麽這個區間的中位數一定小於等於k。
  • 下一步,我們對<=k-1的標記為-1,大於k-1的標記為1。如果一個區間的和<=0,那麽這個區間的中位數一定小於等於k-1。
  • 兩者做差,就是中位數為k的。上述過程可通過樹狀數組解決。

F. Berland and the Shortest Paths

  • 有n個點,m條路徑,你需要刪減為n-1條邊,並且使得從1這個點到其他的距離和最短。輸出所有方案。
  • 可以發現,每個點到1這個點的最短距離一定不變。所以只需計算這個點有幾種方案使得距離和最短即可。然後每個點的方案相乘,就是所有的方案。bfs()即可。

codeforces div.3 1005