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