首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

ZOJ 3790 Consecutive Blocks:分段二分

     編輯:C++ 入門

題目

給定數組,可選 ≤ k 個數,使其值相同且下標連續(允許中間有空隙)。求最大可選數量。

解法

  1. 將 (value, index) 排序,值相同則按下標排序。
  2. 同值段內,前綴和 sum[i] 記錄下標間隙總和。
  3. 對每段,雙指針/二分:固定左端 j,找最遠右端 r 使 sum[r] - sum[j] ≤ k。段長 = r - j。
  4. 全局最大值即答案。

代碼片段

sort(T+1, T+n+1, cmp);
for i=1..n:
    if (T[i].c == T[i-1].c) sum[i] = sum[i-1] + T[i].id - T[i-1].id - 1;
    else sum[i] = 0;

ans = 1;
for (int i=1; i<=n; ) {
    int R = upper_bound(g, g+n+1, T[i].c) - g; // 同值段右界
    for (int j=i; j

複雜度

O(n log n),排序 + 每段二分。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved