1. 程式人生 > >刷題——hdu 6180 Schedule

刷題——hdu 6180 Schedule

/*
!!!!!這真心想不到還能這麼寫:
http://blog.csdn.net/jaihk662/article/details/77489061


對於開始時間和終止時間,看成兩個點,每個點用1(開始時間),-1(終止時間)標記
先按點的大小排序,大小相同的按標記大小排序(終止時間在開始時間前面)


本題除了要求最少機器外還要求最少機器下每個機器執行時間的總和,用兩個陣列記錄每個機器的開始時間和結尾時間
int sum=0,ans=0;//sum記錄每次加入點後的機器數,ans為當前最大機器數
for(int i=0;i<m;i++){
    sum+=e[i].flage;
    if(sum>ans){//若sum>ans需要加入了一個新機器,ans更新,同時更新這個機器的開始時間
        ans=sum;
        l[sum]=e[i].x;
    }
}
結束時間的更新也一樣,和就是res=sum(r[1...m]-l[1...m]);
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define ll long long
#define MAXN 100100
struct node{ll x;int flage;};
bool cmp(node a,node b){
    return a.x<b.x||a.x==b.x&&a.flage<b.flage;
}
node e[2*MAXN];
ll l[MAXN],r[MAXN];
int n,m;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        ll s,d;
        m=0;
        for(int i=1;i<=n;i++){
            scanf("%I64d %I64d",&s,&d);
            e[m].x=s,e[m++].flage=1;
            e[m].x=d,e[m++].flage=-1;
        }
        sort(e,e+m,cmp);
        int sum=0,ans=0;
        for(int i=0;i<m;i++){
            sum+=e[i].flage;
            if(sum>ans){
                ans=sum;
                l[sum]=e[i].x;
            }
        }
        sum=0,ans=0;
        for(int i=m-1;i>0;i--){
            sum-=e[i].flage;
            if(sum>ans){
                ans=sum;
                r[sum]=e[i].x;
            }
        }
        ll res=0;
        for(int i=1;i<=ans;i++){
            res+=r[i]-l[i];
        }
        printf("%d %I64d\n",ans,res);
    }
    return 0;
}