1. 程式人生 > 實用技巧 >2020牛客暑期多校訓練營(第九場) F.Groundhog Looking Dowdy 尺取,雙指標

2020牛客暑期多校訓練營(第九場) F.Groundhog Looking Dowdy 尺取,雙指標

給定n條鏈,每條鏈中有若干個數字

選出其中的m條,從每條中選出一個數,問能夠得到的最小的最大差值。

如果能選,每次都貪心的選擇差最小的一對。那麼不妨對原先的數都排一遍序放到容器裡。然後相當於必須找到m個不同的才能選取。

由於每次列舉L都是最多一個m發生變化。所以複雜度是沒問題的。

vector<pii> v;
int vis[maxn];

int main() {
    int n = readint();
    int m = readint();
    for (int i = 0; i < n; i++) {
        int k = readint();
        
for (int j = 0; j < k; j++) { int x = readint(); v.push_back(make_pair(x, i)); } } sort(v.begin(), v.end()); int res = INF; int cnt = 0; int l = 0, r = 0; //for (int i = 0; i < v.size(); i++) cout << v[i].first << " " << v[i].second << "\n";
while (l < v.size() - m && r < v.size()) { if (vis[v[r].se]) { r++; continue; } if (!vis[v[r].se] && cnt < m) cnt++, vis[v[r].se] = 1, r++; if (cnt == m) { //cout << l << " " << r << "\n";
res = min(res, v[r - 1].fi - v[l].fi); if (v[l + 1].se != v[l].se) cnt--, vis[v[l].se] = 0; l++; } } printf("%d", res); }