hdu 6180

题解:按开始工作的时间从小到大排序后,用一个set容器维护一下,每次加入找set里面结束时间小于等于开始时间并且最近的点插入即可,然后如果没有小于开始时间的就重新开一台机器即可

  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<algorithm>  
  4. #include<cstring>  
  5. #include<set>  
  6. using namespace std;  
  7. typedef long long int ll;  
  8. const int mx = 1e5+5;  
  9. struct node{  
  10.     int s,e;  
  11. }a[mx];  
  12. bool cmp(node a,node b){  
  13.     return a.s<b.s;  
  14. }  
  15. multiset<int>st;  
  16. int main(){  
  17.     int t,n;  
  18.     scanf("%d",&t);  
  19.     while(t--){  
  20.         scanf("%d",&n);  
  21.         st.clear();  
  22.         for(int i = 0; i < n; i++)  
  23.             scanf("%d%d",&a[i].s,&a[i].e);  
  24.         sort(a,a+n,cmp);  
  25.         ll ans = 0;  
  26.         for(int i = 0; i < n; i++){  
  27.             auto it = st.upper_bound(a[i].s);  
  28.             if(it==st.begin()){  
  29.                 ans += a[i].e-a[i].s;  
  30.                 st.insert(a[i].e);  
  31.             }  
  32.             else{  
  33.                 it--;  
  34.                 ans += a[i].e-*it;  
  35.                 st.erase(it);  
  36.                 st.insert(a[i].e);  
  37.             }  
  38.         }  
  39.         printf("%d %I64d\n",st.size(),ans);  
  40.     }  
  41.     return 0;  
  42. }  
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<set>
using namespace std;
typedef long long int ll;
const int mx = 1e5+5;
struct node{
    int s,e;
}a[mx];
bool cmp(node a,node b){
    return a.s<b.s;
}
multiset<int>st;
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        st.clear();
        for(int i = 0; i < n; i++)
            scanf("%d%d",&a[i].s,&a[i].e);
        sort(a,a+n,cmp);
        ll ans = 0;
        for(int i = 0; i < n; i++){
            auto it = st.upper_bound(a[i].s);
            if(it==st.begin()){
                ans += a[i].e-a[i].s;
                st.insert(a[i].e);
            }
            else{
                it--;
                ans += a[i].e-*it;
                st.erase(it);
                st.insert(a[i].e);
            }
        }
        printf("%d %I64d\n",st.size(),ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值