ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NOIP提高组模拟赛26

2022-06-08 21:02:51  阅读:147  来源: 互联网

标签:26 NOIP int ll dp 连通 模拟 ans 欧拉


好毒瘤啊

目录

A. LCIS

蓝书原题,CF10D 弱化版

首先直接把 LIS 和 LCS 合起来设计一个 DP .

设 \(dp_{i,j}\) 表示 \(A_{1\dots i}\) 和 \(B_{1\dots j}\) 的以 \(B_j\) 结尾的 LCIS,则:

\[dp_{i,j}=\begin{cases}\displaystyle \max_{k<j, B_k<B_j}\{dp_{i-1,k}\}&A_i=B_j\\dp_{i-1,j}&A_i\neq B_j\end{cases} \]

这样是 \(O(n^3)\) 的,肯定过不去 .

然而因为 \(A_i=B_j\),我们可以把上面那个带 max 的转移里 \(B_j\) 换成 \(A_i\),这样可以发现当 \(i\) 一定时 max 只增不减,于是用一个变量记录一下,这样就是 \(O(n^2)\) 的了 .

using namespace std;
typedef pair<int, int> pii;
const int N = 3456, INF = 0x3f3f3f3f;
typedef long long ll;
int n, a[N], b[N], dp[N][N];
int main()
{
	scanf("%d", &n);
	for (int i=1; i<=n; i++) scanf("%d", a+i); 
	for (int i=1; i<=n; i++) scanf("%d", b+i);
	for (int i=1, val; i<=n; i++)
	{
		val = 1;
		for (int j=1; j<=n; j++)
		{
			dp[i][j] = dp[i-1][j];
			if (a[i] > b[j]) chkmax(val ,dp[i-1][j] + 1);
			if (a[i] == b[j]) chkmax(dp[i][j], val);
		}
	}
	int ans = 0;
	for (int i=1; i<=n; i++) chkmax(ans, dp[n][i]);
	printf("%d\n", ans); 
	return 0;
}

B. 物流运输

[ZJOI2006] 物流运输

30pts,,,,然而写法好像和其他人的不太一样,先放着

C. tree

[国家集训队]Tree I

gugugu

D. 建造游乐园

正睿原题

显然题目等价于 \(n\) 点欧拉图个数乘上 \(\dbinom n2\) .

令 \(f_n\) 表示 \(i\) 个点的欧拉图数量,\(g_n\) 表示 \(n\) 个点度为偶数的无向图数量 .

众所周知图存在欧拉回路当且仅当没有奇点 .

于是考虑加一个点,容斥掉不连通的

如果原图存在一个欧拉子图,那么 \(i\) 必然要连另外一方面,因为要保持性质,\(i\) 必须连奇点,于是就不连通了(\(i\) 连所有奇点) .

\(g_n\) 显然等于 \(2^{\tbinom{n-1}2}\)(钦定 \(n-1\) 个点随便连,剩下那个点用来平衡奇度点),于是递推式就是

\[f_n=g_n-\sum_{i=1}^{n-1}f_ig_{n-i}\dbinom{n-1}{i-1} \]

DP,\(O(n^2)\) .

using namespace std;
typedef pair<int, int> pii;
const int N = 2222, INF = 0x3f3f3f3f, P = 1e9+7;
typedef long long ll;
int n;
ll C[N][N], f[N], g[N];
ll qpow(ll a, ll n)
{
	ll ans = 1;
	while (n)
	{
		if (n&1) ans = ans * a % P;
		a = a * a % P; n >>= 1;
	} return ans;
}
int main()
{
	C[0][0] = 1;
	for (int i=1; i<N; i++)
	{
		C[i][0] = 1;
		for (int j=1; j<=i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
	}
	scanf("%d", &n);
	for (int i=1; i<=n; i++) g[i] = qpow(2, C[i-1][2]);
	for (int i=1; i<=n; i++)
	{
		f[i] = g[i];
		for (int j=1; j<i; j++) f[i] = (f[i] - f[j] * g[i-j] % P * C[i-1][j-1] % P + P) % P;
	} printf("%lld\n", f[n] * C[n][2] % P);
	return 0;
}

下面说一下 \(O(n\log n)\) 做法 .

让我们快进到 DP .

zero4338 是一眼看穿了这题的做法的 .

首先一个关键点:度数都为偶数的图可以分成若干个欧拉图,于是欧拉图计数完全等价于连通图计数 .

考虑 exp 的组合意义,因为普通图可以划分成若干个连通图 , 所以普通图是连通图的 exp , 连通图就是普通图的 ln .

根据快进了的 DP 环节,我们知道连通图的方案数就是 \(g_n\) .

所以令 \(f_n\) 的 EGF 为 \(F(z)\),\(g_n\) 的 EGF 为 \(G(z)\),则

\[F=\ln G \]

\(G\) 可以线性预处理,一次多项式 \(\ln\) 求出 \(F\),\(O(n\log n)\) .

然而不得不谈的是模数是 \(10^9+7\),我们仔细探讨一下过程,发现这个是完全依赖于任意模数多项式乘法的,直接 MTT 即可,还是 \(O(n\log n)\) .

然而这个带标号欧拉图计数就是 OEIS A033678 .

标签:26,NOIP,int,ll,dp,连通,模拟,ans,欧拉
来源: https://www.cnblogs.com/CDOI-24374/p/16357167.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有