题目大意::给定n个时间调度让你排布,一个机器不能有冲突,冲突则新加一个机器,求最小机器数与最小时间总数(时间数即为一个机器的结束减开始)
这道题如果用暴力做会超时,每次找到最小的end时间会浪费很多时间,如果用multiset会快很多,因为他能自动排序。
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
typedef long long ll;
using namespace std;
struct node{
int begin;
int end;
}a[100005];
bool cmp(node x,node y ){
return x.begin<y.begin;
}
multiset<int>st;
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
st.clear();
scanf("%d",&m);
for(int i=0;i<m;i++)scanf("%d %d",&a[i].begin,&a[i].end);
sort(a,a+m,cmp);
ll ans=0;
for(int i=0;i<m;i++){
auto it =st.upper_bound(a[i].begin);
if(it==st.begin())
{
ans += a[i].end-a[i].begin;
st.insert(a[i].end);
}
else{
it--;
ans += a[i].end-*it;
st.erase(it);
st.insert(a[i].end);
}
}
printf("%d %I64d\n",st.size(),ans);
}
return 0;
}