51nod 1686 第K大區間 二分 尺取

2021-08-08 21:30:41 字數 949 閱讀 4658

題意:定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。

思路:答案具有單調性,所以可以二分,關鍵是check的時候怎麼統計有多少區間滿足》=mid, 我們可以知道假如區間[l, r]滿足,那麼左右擴大這個區間都是滿足的,所以可以尺取,列舉右端點,找到最大的符合條件的l即可,對答案貢獻為l,而且l也只會向右動。右端點向右移動一步,有兩種情況,一種情況是l不變,另一種是a[r]能與l右邊的乙個點滿足區間出現mid次a[r],這樣l就可以跳到這個點。 所以預處理出b[i],表示每個點往前出現第mid個a[i]的位置。

**:

#includeusing namespace std;

typedef long long ll;

const int maxn = 1e5+5;

int a[maxn], hash[maxn];

int num[maxn], pos[maxn], pre[maxn], nxt[maxn], b[maxn];

ll n, k;

ll judge(int x)

memset(pos, 0, sizeof(pos));

for(int i = n; i >= 1; i--)

memset(pos, 0, sizeof(pos));

memset(num, 0, sizeof(num));

memset(b, 0, sizeof(b));

for(int i = 1; i <= n; i++)

for(int l = 0, r = 1; r <= n; r++)

l = max(l, b[r]), cnt += l;

return cnt;

}int main(void)

printf("%d\n", ans);

}return 0;

}

51Nod 1686 第K大區間

題意 中文題,定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。離散化二分答案加尺取判斷 include include includeusing namespace std const int maxn 100006 typedef long long l...

51nod 1686 第K大區間

1686 第k大區間 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。input 第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2...

51 nod1686 第K大區間

定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。很簡單的乙個題啊。然後我想了很久,是不是藥丸了啊。才四級題就差點想不出來了 明顯地二分乙個答案mid啊 主要是一開始思路死在乙個地方了,在考慮判斷是否合法 但其實我們並不需要在意我們找到這個數是不是眾數 因為...