input:
1
4 2
1 3
2 4
6 7
4 7
output:
2
题目大意:给我们n个区间,我们可以选择一个端点,将端点所在的区间给拿走,但是我们一次最多拿k个区间,问最少拿多少次可以将所有区间拿完。
解题思路:上自己比赛时手写的思路,字迹较丑,不喜勿喷。
上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=1E5+10;
int n,k;
struct node {
int l;
int r;
int pos;
}p1[N],p2[N];
bool cmp1(struct node a,struct node b)
{
return a.r<b.r;
}
bool cmp2(struct node a,struct node b)
{
return a.l<b.l;
}
struct cmp{
bool operator()(const node a,const node b)const
{
return a.r>b.r;
}
};
bool vis[N];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
cin>>n>>k;
memset(vis,false,sizeof vis);
for(int i=1;i<=n;i++)
{
cin>>p1[i].l>>p1[i].r;
p2[i].l=p1[i].l;
p2[i].r=p1[i].r;
p1[i].pos=p2[i].pos=i;
}
sort(p1+1,p1+n+1,cmp1);
sort(p2+1,p2+n+1,cmp2);
int ans=0;
priority_queue<node,vector<node>,cmp >q;
int tag=0;
int cnt=0;
for(int i=1,j=1;i<=n;i++)
{
if(!vis[p1[i].pos])
{
while(j<=n&&p2[j].l<=p1[i].r)
{
q.push(p2[j]);
j++;
}
ans++;
for(int x=1;x<=k;x++)
{
if(q.empty())
break;
vis[q.top().pos]=true;
q.pop();
}
}
}
cout<<ans<<endl;
}
return 0;
}