「多校联训」I Love Random

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了「多校联训」I Love Random脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

可以说是一种dp的思维技巧

PRoblem

给定一个排列 (p),你可以智慧地按顺序选择多个区间使这个区间的每个数都等于这个区间的最小值。问最后能得到多少个不同的排列,答案对 (10^9+7) 取模。((len_p le 5000)


Solution

起初我想了一个区间 dp,想必也是大众容易想到的。对于区间 ([l,r]),找到其中最小值所在的位置 (k)。然后枚举 (k) 能覆盖到的区间,前缀和优化是 (mathcal {O}(n^2LOG_2n)) 的。 但是这样做会有一个很大的问题:

「多校联训」I Love Random

如图,(a_i>a_j>a_k),当我们考虑 (dp[i][k]) 的转移时枚举到 (j),我们用到的是 (dp[i][j-1]),但是这显然没有图中这种情况。

既然考虑原序列有后效性的话,考虑直接构造答案序列。 具体地,令 (dp[i][j]) 表示考虑获得了长度为 (i) 的答案序列,第 (i) 个值为 (p_j)方案总数。 这样的话,转移就很简单了(其实也不简单)。 首先用一个通用套路,考虑 ([L_i,R_i])(p_i) 能修改到的范围。令最后的答案序列为 ({a})。考虑两种情况。令 (a_{i-1}=k)。令 (a_i=t)。 读者容易证明这里 (a_i)单调递增的。换句话说,只要保证 (forall L[t] le i le R[t]),且其单增,这种方案一定合法。所以直接转移就可以啦~ 于是好像就做完了,(L、R) 数组暴力就可以搞出来。

#include <cstdio>
#include <algorIThm>
#include <cmath>
#include <cstring>
#include <iostream>
#define LL long long
#define uint unsigned int
using namespace std;
const int MAXN = 5e3 + 5, Mod = 1e9 + 7; 
#define Debug(x) cerr << #x << ' ' << x
#define hh cerr << endl
int n, a[MAXN], L[MAXN], R[MAXN], dp[2][MAXN], res;
int Qplus(int x, int y) { return x + y >= Mod ? x + y - Mod : x + y; }
int main() {
//	freoPEn("C.in", "r", stdin);
//	freopen("C.out", "w", stdout);
	scanf("%d", &amp;n);
	for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
	for(int i = 1; i <= n; i ++) {
		for(int j = i; j >= 1; j --) if(a[j] < a[i]) { L[i] = j + 1; break; }
		if(!L[i]) L[i] = 1;
		for(int j = i + 1; j <= n; j ++) if(a[j] < a[i]) { R[i] = j - 1; break; }
		if(!R[i]) R[i] = n;
	}
	for(int i = 1; i <= n; i ++) if(L[i] == 1) dp[1][i] = 1;
	for(int i = 2; i <= n; i ++) {
		bool f = (i & 1); int tmp = 0;
		for(int j = 1; j <= n; j ++) dp[f][j] = 0; // 滚动数组清零( 
		for(int j = 1; j <= n; j ++) {
			tmp = Qplus(tmp, dp[f ^ 1][j]);
			if(L[j] <= i && R[j] >= i) dp[f][j]	= Qplus(dp[f][j], tmp);
		}
	}
	for(int i = 1; i <= n; i ++) res = Qplus(res, dp[n & 1][i]);
	printf("%d", res);
	return 0;
}


脚本宝典总结

以上是脚本宝典为你收集整理的「多校联训」I Love Random全部内容,希望文章能够帮你解决「多校联训」I Love Random所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。