题意:
给出数字n和k,n表示接下来将输入n个在x轴上的闭区间[li,ri],找出被包含了至少k次的点,并求由这些点组成的连续区间的数目,并使该数目最小。输出该数目并将区间从左到右(x的正方向)输出。
l 是 sum++, 先加再判断
r 是 sum–,当sum = k 时,先判断 再sum–,这样就可以避免交点的情况
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ff(i,a,b) for(int i = a; i <= b; i++)
#define f(i,a,b) for(int i = a; i < b; i++)
typedef pair<int,int> P;
#define ll long long
P p[2000010];
vector<P> ans;
int main()
{
ios::sync_with_stdio(false);
int n, k;
cin >> n >> k;
ff(i,1,n) {
int x,y;
cin >> x >> y;
p[i] = make_pair(x,1);
p[n+i] = make_pair(y,2);
}
sort(p+1,p+2*n+1);
int sum = 0,tot = 0,flag = 0;
// ff(i,1,2*n) cout << p[i].fi << " " << p[i].se << endl;
// puts("");
ff(i,1,2 * n)
{
if(p[i].se == 1)
{
sum++;
if(sum >= k)
{
if(!flag)
ans.push_back(make_pair(p[i].fi,0));
flag = 1;
}
}
else {
if(sum ==k)
{
ans[tot].se = p[i].fi;
tot++;
flag = 0;
}
sum--;
}
}
cout << ans.size() << endl;
f(i,0,ans.size())
cout << ans[i].fi << " " << ans[i].se << endl;
return 0;
}
本文介绍了一个区间覆盖问题的解决思路及实现代码。该问题要求找出被至少k个区间覆盖的所有点,并统计这些点构成的连续区间的数量。通过记录每个区间的开始和结束位置,并按顺序处理这些位置来解决问题。
&spm=1001.2101.3001.5002&articleId=72458247&d=1&t=3&u=66d83bf2eb224fde8a66bb32c0b90f10)
418

被折叠的 条评论
为什么被折叠?



