51NOD1105 第k大的數 二分答案

2022-02-27 22:23:18 字數 2473 閱讀 8743

先排序,二分上下界分別是最小的兩個數和最大的兩個數的乘積。注意到乙個性質,就是a[i]*b[j],i從左到右,j從右到左。假如遇到一組a[i]*b[j]<=x,j就不必再減小了。這時候比x小的數一定是j個。下一次繼續找i,這個b[j]一定不可能大於b[j+1]。問題就由找第k大的數,轉換成找第n*n-k+1小的數。每次二分這個乘積x,看看是否符合條件即可。

1/*2

━━━━━┒ギリギリ♂ eye!

3┓┏┓┏┓┃キリキリ♂ mind!

4┛┗┛┗┛┃\○/

5┓┏┓┏┓┃ /

6┛┗┛┗┛┃ノ)

7┓┏┓┏┓┃

8┛┗┛┗┛┃

9┓┏┓┏┓┃

10┛┗┛┗┛┃

11┓┏┓┏┓┃

12┛┗┛┗┛┃

13┓┏┓┏┓┃

14┃┃┃┃┃┃

15┻┻┻┻┻┻

16*/

17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include 28 #include 29 #include 30 #include 31 #include 32 #include

33 #include 34 #include 35

using

namespace

std;

36#define fr first

37#define sc second

38#define cl clear

39#define bug puts("here!!!")

40#define w(a) while(a--)

41#define pb(a) push_back(a)

42#define rint(a) scanf("%d", &a)

43#define rll(a) scanf("%lld", &a)

44#define rs(a) scanf("%s", a)

45#define cin(a) cin >> a

46#define fread() freopen("in", "r", stdin)

47#define fwrite() freopen("out", "w", stdout)

48#define rep(i, len) for(int i = 0; i < (len); i++)

49#define for(i, a, len) for(int i = (a); i < (len); i++)

50#define cls(a) memset((a), 0, sizeof(a))

51#define clr(a, x) memset((a), (x), sizeof(a))

52#define full(a) memset((a), 0x7f7f, sizeof(a))

53#define lp p << 1

54#define rp p << 1 | 1

55#define pi 3.14159265359

56#define rt return

57#define lowbit(x) x & (-x)

58#define onenum(x) __builtin_popcount(x)

59 typedef long

long

ll;60 typedef long

double

ld;61 typedef unsigned long

long

ull;

62 typedef pairpii;

63 typedef pairpsi;

64 typedef mapmsi;

65 typedef vectorvi;

66 typedef vectorvl;

67 typedef vectorvvl;

68 typedef vectorvb;

6970

const

int maxn = 50050;71

ll n, k, ans;

72ll a[maxn], b[maxn];

7374

bool

ok(ll x)

82 ret +=j;83}

84return ret >=k;85}

8687

intmain()

94 sort(a+1, a+n+1); sort(b+1, b+n+1

);95 ll l = a[1] * b[1], r = a[n] *b[n];

96while(l <=r)

102else l = m + 1

;103

}104 cout << ans <105}

106 rt 0

;107 }

51Nod 1105 第K大的數

acm模版 這裡使用二分套二分查詢即可。一般的二分查詢是通過下標範圍查詢,而二分套二分是為了求兩個陣列組合乘積的問題,查詢第k大的值,這裡我們需要通過資料的範圍查詢,而不是下標的範圍,這裡需要兩次快排。需要強調的一點是資料範圍問題!一定要使用long long型,避免資料溢位!include inc...

51nod 1105 第K大的數

1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...

51nod 1105第K大的數

1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是 a 0 b 0 a 0 b 1 a 0 b n 1 a 1 b 0 a 1 b 1 a 1 b n 1 a n 1 b 0 a ...