首页 > 其他分享 >CF1295F - Good Contest

CF1295F - Good Contest

时间:2024-02-19 12:33:27浏览次数:27  
标签:le Contest int len ++ Good CF1295F dp

题意:
\(a_i\)​ 是在 \([l_i​,r_i]\) 上均匀随机分布的整数,求 \(a_{1\dots n}\)​ 单调不增的概率。
对 \(998244353\) 取模。
\(2\le n \le 50,0\le l_i\le r_i\le998244351\)。

首先可以把概率转化为总方案数在除以 \(\prod r_i-l_i+1\),
考虑出朴素的 dp,设 \(f_{i,j}\) 为 $选了前 \(i\) 个且最后一个数为 \(j\),
转移方程为 \(f_{i,j}=\sum_{k\ge j}f_{i-1,k}\)。
但是时间复杂度 \(O(nV)\),问题出在值域太大的问题上。
考虑优化状态,把所有区间变成左闭右开然后再离散化,把值域分成了 \(O(n)\) 段,然后再做 dp。
但是同一段的数是无法知道大小关系的,所有 dp 还有枚举连续段,然后通过组合数算出不降的方案数。
通过前缀和优化可做到 \(O(n^3)\)。

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

标签:le,Contest,int,len,++,Good,CF1295F,dp
From: https://www.cnblogs.com/kevinlikescoding/p/18020814

相关文章

  • AtCoder Beginner Contest 341
    AtCoderBeginnerContest341做得太慢了,原因BC题意很难懂,而且一开始AtCoderBetter加载不出来,不好翻译(先用10min做的AB。其中B好几次读错题。看C发现题面这么长压根看不懂,先看小清新D。发现一眼出思路,二分很快写完了。后来调二分边界用了很长时间,实际上此时已经......
  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)(菜小白)
    A-Print341思路:给你一个整数N有N个0和N+1个1组成 01交替输出1 解法:输出10最后输出最后剩余的1即可Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);intN;cin>>N......
  • AtCoder Grand Contest 012 E Camel and Oases
    洛谷传送门AtCoder传送门容易发现跳跃次数为\(O(\logV)\)。考虑对于跳跃\(k\)次后的限制\(\left\lfloor\frac{V}{2^k}\right\rfloor\),对每个点预处理出不再跳跃能到达的最左和最右的点\([l_{k,i},r_{k,i}]\)。于是问题变成了,从第\(i\)个区间集选择一个区间\([a_i,......
  • AtCoder Beginner Contest 340 题解
    AtCoderBeginnerContest340题解去我的洛谷博客里看这篇文章!A-ArithmeticProgression模拟即可。//2024/2/11PikachuQAQ#include<iostream>usingnamespacestd;inta,b,d;intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>......
  • AtCoder Beginner Contest 340 题解
    AtCoderBeginnerContest340题解去我的洛谷博客里看这篇文章!A-ArithmeticProgression模拟即可。//2024/2/11PikachuQAQ#include<iostream>usingnamespacestd;inta,b,d;intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>......
  • KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340)
    KAJIMACORPORATIONCONTEST2024(AtCoderBeginnerContest340)A-ArithmeticProgression代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128......
  • C1. Good Subarrays (Easy Version)
    找子数组的个数双指针#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=2e5+10;inta[N];voidsolve(){ intn; cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; intl=1,r=1; intans=0; while(l<=r){ if(l>n||r>......
  • AtCoder Beginner Contest 340 考试总结
    前言可惜的是我是VP的,却打得相对较好(服了。得分明细:ABCDEFGTotal√√√√√√×2625改题明细:ABCDEFG√√√√√√×第一次打AT,发挥还可以。A.ArithmeticProgressionProblem打印一个包含第一项\(A\),最后一项\(B\)......
  • Atcoder Educational DP Contest 题解
    比赛链接:Atcoderr或者题单A:Frog1常规线性dp,注意到对于每个落点来说,青蛙只能由第\(i-1\)个石头或者第\(i-2\)个石头转移得到,那么我们让\(dp[i]\)为当跳到第\(i\)个石头上的最小费用。此时显然有:\[dp_i=\min(dp_{i-1}+\left|h_i-h_{i-1}\right|,dp_{i-2}+\left|h_......
  • D. Good Trip
    原题链接题解1.把分数中的除法用乘以逆元表示,在求模运算里的除法都可以用乘以逆元代替(如果除法的结果为整数),但是这里规定了可以用其表示,那就用其表示2.读题code#include<bits/stdc++.h>intmod=1e9+7;//确保mod是一个整数usingnamespacestd;//快速幂函数,计算base......