有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;
}


京公网安备 11010502036488号