タイトル説明
n個の数
a1、...、anが与えられた場合、Teacher Gaoは、al、...、ar内の隣接する要素のペアがいくつ同じ値を持っているかを知りたいと考えています。Gao先生は、この数値をv [l、r]で表される間隔[l、r]の値として定義しています。たとえば、5つの数値1,1,1,2,2で構成される間隔の値は3です。
ここで、Gao先生は、すべてのv [l、r](1≤l≤r≤n)の中でk番目に小さい値を知りたいと考えています。しかし、ガオ先生はガールフレンドと遊びに行きたいので、この問題をあなたに任せました。彼がそれを解決するのを手伝ってください。
入力データ
最初の行の整数はt(1≤t≤30)です。これは、データのグループがt個あることを意味します。
データの各セットについて:
最初の行には2つの整数n、k(1≤n≤2000,1≤k≤n(n + 1)/ 2)があり、
2番目の行にはn個の整数a1、...、an( 1≤ai≤109)。
出力データ
データのグループごとに:k番目に小さい値を表す整数を出力します。
サンプル入力
2
4 7
1 1 2
3 5
100 100 100
サンプル出力
0
1
経験:1。
単一の数も間隔であるため、nの数にはn(n + 1)/ 2の間隔があります
2.二分法、データを半分にし、検索の数を減らします
3.ルーラーを取ります(ヘビの移動)、特定の値(二分法の中央値)以下の間隔の数を見つけます
。4。配列を01で書き直します。
def getRangeN(mid,nums,n):
rangeN = 0
p = 0
sumRange = 0
for i in range(n):
while p < n:
if sumRange <= mid:
sumRange += nums[p]
p += 1
else:
break
sumRange -= nums[i]
rangeN += p - i
return rangeN
T = int(input())
for t in range(T):
n, k = list(map(int, input().split()))
s = [int(item) for item in input().split()]
nums = []
for i in range(1, len(s)):
if s[i]==s[i-1]:
nums.append(1)
else:
nums.append(0)
nums.append(0)
left = 0
right = n-1
while left < right:
mid = int((left+right)/2)
if(getRangeN(mid,nums,n)>=k):
right=mid
else:
left=mid+1
print(left)