日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Let‘s Play Curling 二分,lower_bound(2020.12.南京)

發布時間:2025/3/19 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Let‘s Play Curling 二分,lower_bound(2020.12.南京) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



題意 :

  • 紅石頭屬于紅隊,藍石頭屬于藍隊,分別給出所有紅色藍色石頭在數軸上的位置,構造目標點的位置(實數),使得紅隊勝利且獲得的分數盡可能多,紅隊的分數 等于 所有 比所有藍石頭離目標點近 的紅石頭 的數量,求 紅隊的最大分數或者如果無法贏就輸出impossivle

思路 :

  • 確定一個c點,紅隊中距離c的位置比藍隊中所有石頭都近的 石頭的個數,就是紅隊的分數,發現尋找c點不好找,于是轉換思路,發現兩個藍色石頭之間紅色石頭的數量的最大值即為答案,因為在兩個藍色石頭之間的紅色石頭一定比所有藍色石頭更近c,且藍色石頭外的紅色石頭不滿足比所有藍色石頭更近,因此,證為最優解
  • 先將兩個序列排序,然后用lower_bound或者upper_bound尋找在兩個藍色石頭間紅色石頭的個數
  • 特別地,在第一個藍色石頭之前的和最后一個藍色石頭之后的也滿足條件,因此,在最前面和最后面再增加藍色石頭
  • lower_bound復雜度O(logN)O(logN)O(logN),返回值是下標
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <unordered_set> #include <math.h> using namespace std;typedef long long ll; typedef pair<int, int> PII;#define endl '\n' #define fi first #define se second #define push_back #define rep(i, l, r) for (ll i = l; i <= r; i ++ )const int N = 1e5 + 10;int a[N], b[N];void solve() {int n, m; cin >> n >> m;for (int i = 1; i <= n && cin >> a[i]; i ++ );for (int i = 1; i <= m && cin >> b[i]; i ++ );sort(a + 1, a + n + 1);sort(b + 1, b + m + 1);b[0] = 0;b[m + 1] = 1000000001;int ans = 0;for (int i = 1; i <= m + 1; i ++ ){int l = b[i - 1], r = b[i];int len = lower_bound(a + 1, a + n + 1, r) - 1 - upper_bound(a + 1, a + n + 1, l) + 1;ans = max(ans, len);}if (ans == 0) cout << "Impossible" << endl;else cout << ans << endl; }int main() {cin.tie(nullptr) -> sync_with_stdio(false);int _;cin >> _;while (_ -- )solve();return 0; }

總結

以上是生活随笔為你收集整理的Let‘s Play Curling 二分,lower_bound(2020.12.南京)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。