POJ2665 Trees

来源:互联网 发布:淘宝秋季休闲鞋女鞋 编辑:程序博客网 时间:2024/06/05 03:41
 对给出的区间进行排序 以开始时间为第一关键字,结束为第二关键字,对排序后的区间进行合并操作, 后面就很简单了
#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;}

0 0
原创粉丝点击