您的位置:首页 > 其它

POJ2665 Trees

2014-08-04 18:12 197 查看
对给出的区间进行排序 以开始时间为第一关键字,结束为第二关键字,对排序后的区间进行合并操作, 后面就很简单了
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int M = 50005;

struct node {

    int star;
    int endl;
}oper[M];

int n, m;
int ans;

bool cmp(node p1, node p2) {

    if(p1.star != p2.star)
        return p1.star < p2.star;

    return p1.endl < p2.endl;
}

int main()
{
  while(scanf("%d%d", &n, &m) != EOF) {

     if(!n && !m)
        break;
     for(int i = 0; i < m; i++)
        scanf("%d%d", &oper[i].star, &oper[i].endl);

    sort(oper, oper + m, cmp);

    int s = oper[0].star;
    int e = oper[0].endl;
      int i = 1;
      int k = 0;
    while(i < m) {  //合并操作。

        if(s <= oper[i].star && oper[i].endl <= e){

            i++;

        }else if(s <= oper[i].star && oper[i].endl > e && e >= oper[i].star){

                e = oper[i].endl;
                i++;
        }else {

            oper[k].star = s;
            oper[k++].endl = e;
            s = oper[i].star;
            e = oper[i].endl;
            i++;

        }
    }
    oper[k].star = s;
    oper[k].endl = e;
     ans = n+1;
    for(i = 0; i <= k; i++) {

        ans -= (oper[i].endl - oper[i].star + 1);
        //printf("%d %d %d  %d\n", i, oper[i].star, oper[i].endl, ans);
    }
    printf("%d\n", ans);
  }
    return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: