溫澈瀅的狗狗(二分)

2021-10-19 17:58:51 字數 1443 閱讀 3711

link

題目描述

眾所周知,溫澈瀅在宿舍養了一排 n 只狗狗,每只狗狗都有乙個顏色 cic_ici​ 。同時,它們只喜歡和不同顏色的狗狗玩,否則它們會覺得很單調無趣。

也就是說,如果第 i 只狗狗和第 j 只狗狗顏色不同,那麼它們可以擁有親密關係,它們親密度可以表示成 ∣i−

j∣∣i

−j∣∣

i−j∣

∣i−j∣\mid i-j\mid∣i−j∣

∣i−j∣∣

i−j∣

∣i−j

∣,否則它們就不能建立親密關係。

當 n 只狗狗顏色兩兩不同時,它們有n(n

−1)2

n(n−

1)22

n(n−

1)

​n(n−1)2\frac2n(n−1)​

n(n−1)

22n(

n−1)

​2n(

n−1)

​對親密關係;當 n 只狗狗的顏色完全一致時,它們之間就不存在任何一對親密關係。

現在溫澈瀅想知道第 k 對親密關係是哪一對狗狗,當然,必要的時候你可以告訴溫澈瀅這些狗狗之間不存在這麼多的親密關係。

輸入描述:

第一行輸入兩個數字 n 和 k 。

第二行給出 n 個數字,第 i 個數字 ci​

ci​ci

​ 表示第 i 只狗狗的顏色。

輸出描述:

如果存在第 k 對狗狗,請在一行內輸出兩隻狗狗的編號,小的在前,中間用乙個空格隔開。

否則輸出 -1 。

思路來自題解:

倘若我們知道了第k對親密關係的親密值是多少就好辦了,顯然可以二分, 那二分什麼呢, 二分親密度, 因為最終的排名就是按照親密度公升序排列, 我們只需找到當前的小於當前二分的親密度的關係對數, 是不是大於k即可, 在查詢小於k的親密度關係對數是,可以用雙指標, 維護乙個差值為k的區間, 然後依次求出當前區間最左邊中的元素與區間中所有元素的親密度即可

這裡借鑑別人的**

#include

using

namespace std;

#define ll long long

const ll n =

2e5+10;

ll c[n]

, vis[n]

, n, k;

ll check

(ll mid)

return ans;

}int

main()

if(ans ==0)

ll las =

check

(ans -1)

;for

(ll i = ans +

1; i <= n; i++)}

return0;

}

二分的模板(花式二分)

對於不下降序列a,n為序列a元素的個數,key為關鍵字 1.求最小的i,使得a i key,若不存在,則返回 1 int binary search 1 inta,intn int key if a r key returnr return 1 2.求最大的i,使得a i key,若不存在,則返回 ...

leetcode 那些不像二分的二分

魯迅先生曾經說過 有的二分問題,看著不像二分,但是是真的二分,一旦二分,是真的666 2021年3月21日leetcode周賽第三題 寫這道題是為了記錄一下這個精妙的二分 貪心解法。class solution else return high 計算長度為len的陣列,並且最大值為high的最小總和...

二分查詢和遞迴的二分查詢

在乙個有序的陣列中查詢給定的資料項,把陣列衝中間分成兩半,然後看要查詢的資料項在陣列的哪一半,再次折半查詢。如下 public int find long searchkey else if lowerbound upperbound else private int recfind long se...