排列计算题解
排列计算
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; }