刷題——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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章