https://ac.nowcoder.com/acm/contest/3979/A
题目描述
有n个独立的随机变量,其中 xi的值是一个从[li,ri]中随机选取的整数,即对于[li,ri]中的任何一个整数 j,xi=j的概率都是 (ri−li+1)−1 。
现在你需要给出一个长度为n的排列p,那么可以得到一个长度为n的随机变量序列 。你的目标是让结果序列的逆序对个数的期望尽可能少。
求逆序对个数的期望的最小值。
输入描述:
第一行输入一个整数n(1≤n≤5×103)。
接下来 n 行每行两个整数 li,ri(1≤li≤ri≤109)。
输出描述:
输出一行一个整数,表示答案对 998244353 取模后的值。假设答案的最简分数表示是 x y \frac{x}{y} yx,你需要输出一个整数k满足 k×y≡x mod 998244353。
示例输入
3
1 2
2 3
1 3
示例输出
332748118
这道题题意说得不是很清楚。题意大概是,让你造一个排列p,p中第i个元素对应的是区间[li,ri]。这样你造的排列就会对应得到一个随机序列。而你要让这个随机序列的逆序对个数期望尽可能小。
怎样才能使逆序对个数期望尽可能小呢?
贪心策略为以区间中点从小到大排序。
为什么呢?
首先,两个区间的关系只有以下几种:
- 如果两个区间的中点重合,那么由于对称,这两个区间的顺序不影响逆序对个数的期望。
- 如果不在同一个位置,可以把一个区间补一点,使之中点重合。如果补的那块比较大,那么该区间应该在前面,反之在后面……
明白这个贪心策略后,就可以直接算概率啦~
记得预处理inv(不然会T)
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define MOD 998244353
#define MAXN 5010
using namespace std;
typedef pair<int, int> P;
P p[MAXN]