题意:
给出数字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;
}