排列计算题解

排列计算

http://www.nowcoder.com/questionTerminal/3c01283b486b40b1be29ea610247d4f5

有1到n个数字,然后m个查询,构造一个序列,使得查询后的值最大化。
因为只输出一次,不需要关心到底是怎么构造的,考虑,被查询到的数字次数越多,那么就让他的值越大,则,差分前缀和求出每个数字被查询的次数,然后排序,出现次数最小的对应1,最大的对应n即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
int d[N];
int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; i++){
        int l, r;
        scanf("%d%d", &l, &r);
        d[l] ++ ,d[r + 1]--;
    }
    for(int i = 1; i <= n; i++){
        d[i] += d[i - 1];
    }
    sort(d + 1, d + n + 1);
    ll ans = 0;
    for(int i = 1; i <= n; i++)
        ans += 1ll * d[i] * i;
    printf("%lld\n", ans);
    return 0;
}
全部评论
感谢老哥的题解(^=^),不过第22行里d[i]*i好像会爆int,强转了下才a的。
点赞 回复 分享
发布于 2020-05-10 22:43
感谢!爱你么么哒
点赞 回复 分享
发布于 2020-05-11 10:58

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
藏剑天涯:全要了 领4份工资
点赞 评论 收藏
分享
9 收藏 评论
分享
牛客网
牛客企业服务