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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Median断点法求区间-匹配-memset数组与vector

發布時間:2025/3/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Median断点法求区间-匹配-memset数组与vector 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


Sample Input
3
4 4
2 4 3 1
4 3
1 3 4
4 3
2 3 4

Sample Output
YES
YES
NO

題意 :

  • 將1 - n的n個整數分成m個集合,滿足第i個集合的中位數為bi,求是否存在解。中位數定義為c[(k + 1) / 2],相當于123中的2或者1234中的2

思路 :

  • 顯然b數組的m個數放在m個集合,剩下的n - m個數要放到這m個集合中且不影響原本的中位數。比如對于樣例n = 6, m = 2,b = {3, 5}時,集合被分為[1,2], [4], [6]三段。且任意兩段中的一對數字可以被配對消掉,以及最后剩下來的數字一定是同一段內的
  • 如果長度最大的段的長度mx <= 其他段數之和sum,直接輸出YES,反之,那么這一段最后會剩下數字,此時當且僅當這一段左邊的集合(中位數小于這一段的中位數)個數 大于等于 這一段剩下的數字的個數 時(把剩下的數字放在分別放在左邊那幾個集合的右邊,利用1234中2是中位數的性質),為YES,否則為NO
#include <iostream> #include <algorithm> #include <vector>#define x first #define y secondusing namespace std;typedef long long LL;const int N = 1e5 + 10;int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int T;cin >> T;while (T -- ){int n, m;cin >> n >> m;vector<int> a(n + 10); // 如果使用數組每次還要memset,且多開更多空間,不如還是vectora[n + 1] = 1; // wa,因為是通過斷點求區間,否則最后一個區間就沒有了for (int i = 1; i <= m; i ++ ){int x;cin >> x;a[x] = 1;}vector<pair<int, int>> vc; // 這個區間的長度,左邊有幾個區間int len = 0, cnt = 0, sum = 0;for (int i = 1; i <= n + 1; i ++ ) // wa,要到n + 1,因為是斷點判斷區間{if (!a[i]) len ++ ;else{if (len != 0) // wa,可能一開始就是點{vc.push_back({len, cnt});sum += len;}cnt ++ , len = 0;}}if (n == m){cout << "YES" << endl;continue;}sort(vc.begin(), vc.end());int mx = vc.back().x, ed = vc.back().y;if ((mx <= sum - mx) || (ed >= mx - (sum - mx))) cout << "YES" << endl;else cout << "NO" << endl;}return 0; }

總結

以上是生活随笔為你收集整理的Median断点法求区间-匹配-memset数组与vector的全部內容,希望文章能夠幫你解決所遇到的問題。

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