值周(和区间覆盖大同小异)

登录—专业IT笔试面试备考平台_牛客网

这题肯定不能暴力(因为这道题目的数据很大,暴力的话毫无疑问是tle的)。

那么就需要写进结构体进行排序。

有个大坑:

绝对不能用a[i]和a[i-1]比,因为会遗忘之前的右端点而造成内部的区间进行比较错误地更新sum值!必须和temp右端点比较!!!

#include <iostream>
#include<algorithm>
using namespace std;
int n, m;
struct node {
    int l, r;
}a[1000005];
bool cmp(node a, node b) {
    if (a.l != b.l)return a.l < b.l;
    else return a.r < b.r;
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> a[i].l >> a[i].r;
    }
    sort(a + 1, a + 1 + m, cmp);
    int sum = a[1].r - a[1].l + 1;
    /* for (int i = 2; i <= m; i++) {
        if (a[i].l <= a[i - 1].r && a[i].r > a[i - 1].r) {
            sum += a[i].r - a[i - 1].r;
        }
        else if(a[i].l > a[i - 1].r)sum += (a[i].r - a[i].l + 1);
    }*/
    //这是掉坑里的代码,必WA!!
    int temp = a[1].r;//必须要记录下来!!
    for (int i = 2; i <= m; i++) {
        if (a[i].l <= temp && a[i].r > temp) {
            sum += a[i].r - temp;
            temp = a[i].r;
        }
        else if (a[i].l > temp) {
            sum += (a[i].r - a[i].l + 1);
            temp = a[i].r;
        }
    }
    cout << n + 1 - sum << endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值