CF1295F - Good Contest
题意:
是在 上均匀随机分布的整数,求 单调不增的概率。
对 取模。
。
首先可以把概率转化为总方案数在除以 ,
考虑出朴素的 dp,设 为选了前 个且最后一个数为 ,
转移方程为 。
但是时间复杂度 ,问题出在值域太大的问题上。
考虑优化状态,把所有区间变成左闭右开然后再离散化,把值域分成了 段,然后再做 dp。
但是同一段的数是无法知道大小关系的,所有 dp 还有枚举连续段,然后通过组合数算出不降的方案数。
通过前缀和优化可做到 。
const int N = 55;
int n, a[N], b[N], c[N << 1], len;
mint f[N], g[N];
void solve() {
cin >> n;
FOR(i, 1, n) {
cin >> a[i] >> b[i];
b[i]++;
c[++len] = a[i];
c[++len] = b[i];
}
sort(c + 1, c + len + 1);
len = unique(c + 1, c + len + 1) - c - 1;
FOR(i, 1, n) {
a[i] = lower_bound(c + 1, c + len + 1, a[i]) - c;
b[i] = lower_bound(c + 1, c + len + 1, b[i]) - c;
}
f[0] = 1;
ROF(j, len - 1, 1) {
int l = c[j + 1] - c[j];
g[0] = 1;
FOR(i, 1, n) g[i] = g[i - 1] * (l + i - 1) / i;
ROF(i, n, 1) {
if(a[i] <= j && j < b[i]) {
ROF(k, i - 1, 0) {
f[i] += f[k] * g[i - k];
if(a[k] > j || j >= b[k]) break;
}
}
}
}
mint ans = f[n];
FOR(i, 1, n) {
ans /= c[b[i]] - c[a[i]];
}
cout << ans << endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App