科大讯飞杯F题:思维模拟 排列计算

https://ac.nowcoder.com/acm/contest/5477/F
牛客网的提交地址
真的是好久没打了,最近学校有个比赛想去玩玩的,所以提前半个月准备一下,俗话说的好,临阵磨枪不快也光(2333),好了进入正题,这题是一个记录某个点位在区间内出现的次数比如说给你三个区间[1,3],[3,7],[5,6]这时候肯定直接想到暴力,哈哈显然这题数据范围不可以的,稍微转换一下思路,比如说对于区间[5.6]我们就对a[5]++,a[7]–,这个的原因很显然,如果某个区间包含了这个小区间或者是某一部分,那么比如说对于区间[3,7]包含[5,6]在内,所以我们要对5和6次数在加一的,那么怎么加呢,这里就很巧了,只需要一直a[i]+=a[i-1],因为对于[3,7]的处理就是a[3]++,a[8]–,在我们这样一直迭代加的过程中,不难发现如果存在重叠区间的话就会被包含在内的,对于–的原因就是如果不–得话如果某个更大区间也包含了的话,直接++回多加+的,其余的就是简单排序并且将次数与对应位置的数字相乘就可以啦,简单贪心
直接上AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int a[N];
long long sum=0;
int main()
{
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=m;i++){
        int l,r;
        cin >> l >> r;
        a[l]++;
        a[r+1]--;
    }
    for(int i=1;i<=n;i++){
        a[i]+=a[i-1];
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        sum+=a[i]*i;
    }
    cout << sum << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值