POJ2665 Trees

本文介绍了一种基于区间合并的算法实现,该算法通过对给定区间的排序和合并操作来简化复杂的数据处理流程。首先按照区间的起始时间进行排序,并在此基础上进一步考虑结束时间,确保了后续合并步骤的有效性。通过对合并后的区间进行遍历,计算出未被覆盖的时间段长度,从而实现了高效的时间段计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 对给出的区间进行排序 以开始时间为第一关键字,结束为第二关键字,对排序后的区间进行合并操作, 后面就很简单了
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值