Loading

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);
}

 

posted @ 2020-08-08 19:07  MQFLLY  阅读(153)  评论(0编辑  收藏  举报