首页 > 其他分享 >P10202 [湖北省选模拟 2024] 沉玉谷 Solution

P10202 [湖北省选模拟 2024] 沉玉谷 Solution

时间:2024-02-29 20:35:25浏览次数:33  
标签:沉玉谷 P10202 i1 i2 Solution tp int 区间 modint

好像比题解劣一个 \(n\),但是也跑的很快。

首先说明,问题等价于计算有多少种本质不同的方案使得整个序列被删完,证明省略。

考虑用区间的方式表述这些操作,具体的,忽略删除后的移位操作,将每次删除的左右段点视为一个区间,则一定会有:

  • 区间的并是 \([1,n]\)。
  • 区间之间要么不交,要么包含。
  • 对于每一个区间,没被其内部的区间包含的点一定会与该区间操作的颜色相同。

于是尝试 DP,令 \(f_{l,r,k}\) 表示 \([l,r]\) 内的覆盖方案个数,要求包含 \([l,r]\),同时需要步数是 \(k\) 步,\(g_{l,r,k,v}\) 表示 \([l,r]\) 内的一组覆盖方案,不要求包含完 \([l,r]\),但是要求只能剩下至多一种数,且这种数是 \(v\),同时需要步数是 \(k\) 步。
容易枚举最右侧的区间来转移,算贡献需要使用组合数,于是可以做到 \(O(n^6)\)。

const int N=55;
int a[N];
modint f[N][N][N],g[N][N][N][N],C[N][N];
void solve() {
	int n=read();
	FOR(i,1,n) a[i]=read();
	C[0][0]=1;
	FOR(i,1,n) { C[i][0]=1; FOR(j,1,i) C[i][j]=C[i-1][j]+C[i-1][j-1]; }
	FOR(i,1,n) f[i][i][1]=1,g[i][i][1][0]=1,g[i][i][0][a[i]]=1,g[i][i-1][0][0]=1;
	FOR(len,2,n) FOR(l,1,n-len+1) {
		int r=l+len-1;
		FOR(i1,0,r-l) g[l][r][i1][a[l]]+=g[l+1][r][i1][0]+g[l+1][r][i1][a[l]];
		// FOR(i1,0,r-l) g[l][r][i1][a[r]]+=g[l][r-1][i1][0]+g[l][r-1][i1][a[r]];
		FOR(x,l,r-1) if(a[x]==a[l])
			FOR(i1,0,x-l+1) FOR(i2,0,r-x) FOR(k,0,n)
				g[l][r][i1+i2][k]+=f[l][x][i1]*g[x+1][r][i2][k]*C[i1+i2][i1];
		if(a[l]==a[r])
			FOR(i1,0,r-l-1) {
				modint tp=g[l+1][r-1][i1][a[l]]+g[l+1][r-1][i1][0];
				g[l][r][i1+1][0]+=tp,f[l][r][i1+1]+=tp;
			}
	}
	modint o=0;
	FOR(i,1,n) o+=g[1][n][i][0];
	cout<<o.x<<"\n";
}

标签:沉玉谷,P10202,i1,i2,Solution,tp,int,区间,modint
From: https://www.cnblogs.com/cnyzz/p/18045379

相关文章

  • solution-P1667(more)
    这道题,我不会做,我就是菜,我就是没水平,我就是傻逼。这道题,我不会做,我就是菜,我就是没水平,我就是傻逼。这道题,我不会做,我就是菜,我就是没水平,我就是傻逼。正文直接前缀和,发现操作相当交换\(s_{i-1},s_j\),显然最后我们只需要让\(s\)单调上升即可。直接做,找有多少个环,答案为\(n......
  • niu-zi-solution
    牛子Solutionlink结论:一个方案合法当且仅当,每行数种类为\(2\),或者每列数种类为\(2\)。证明:我们试图证明,如果一个方案存在一行的数种类\(\ge3\),则这个方案的每列数种类为\(2\)。对于有\(\ge3\)种数的这一行,必然存在某连续的三个数两两不同,即形如abc的形式。这个可以......
  • cf1748f-solution
    CF1748FSolutionlink题目也就是要我们交换每对\(a_i\)和\(a_{n-1-i}\)。考虑如何利用这个异或操作交换:我们自然地想到x^=y,y^=x,x^=y。如何操作使得x^=y?我们把环上\(x\)到\(y\)的路径拉出来,假装是个序列:\(a_x.a_{x+1},a_{x+2},\dots,a_{y-2},a_{y-1},a_y\)现在要使......
  • cf1621g-solution
    CF1621GSolutionlink考虑对每个位置\(i\)作为\(i_j\)时计算贡献。\(i\)对一次答案有贡献当且仅当:设其子序列内最右端的位置为\(r\),则要满足\(r\)右侧存在一个数大于\(a_{i}\)。即,设\(lst_i\)表示整个序列最右侧的大于\(a_i\)的数,要满足\(lst_i>r\)。现......
  • cf1606e-solution
    CF1606ESolutionlink考虑dp。注意到这个题造成的伤害与剩余人数有关,每次消灭的人数又与剩余人的血量最大值有关:设\(dp_{i,j}\)表示剩下\(i\)个人中血量最大值为\(j\)的方案数。显然当\(i-1>=j\)时一次伤害就可以杀光所有人,于是这时\(dp_{i,j}=j^i-(j-1)^i\)(只需让......
  • cf1599j-solution
    CF1599JSolutionlink题意:给你一个长为\(n\)的序列\(b\),请你构造一个长为\(n\)的序列\(a\),满足\(b\)中的数都能由\(a\)中两个不同下标的数相加得到。无解报告NO,\(n\le10^3,b_i\le10^6\)。我们发现如果我们能用\(a_1\sima_m\)来凑出\(b_1\simb_m\),剩下的令......
  • cf1583h-solution
    CF1583HSolutionlink第一问容易处理,将边权从大到小排序,并查集维护一下连通块最大值简单搞搞就好。考虑第二问。我们对原树,按照\(t\)的权值建造克鲁斯卡尔重构树,那么两点的lca权值即它们路径上边权最大值。同样按照边权\(c\)从大到小将边排序,维护连通块内最大值的同时,维......
  • cf1555f-solution
    CF1555FSolutionlink分析一张图中的环,我们可以考虑把图表示为一棵生成树加上许多非树边。对于这题,我们考虑动态维护一片森林,在每次准备加一条边\((u,v)\)时:如果这条边加进去后与森林不形成环,那么它与图肯定也不形成环,那么直接加进森林中。如果这条边是森林的一条非树......
  • cf1553f-solution
    CF1553FSolutionlink首先显然地\(\displaystylep_i=p_{i-1}+\sum_{j=1}^{i-1}a_j\bmoda_i+\sum_{j=1}^{i-1}a_i\bmoda_j\)。那么两部分分开来算。\(\displaystyle\sum_{j=1}^{i-1}a_j\bmoda_i\):我们知道\(x\bmody=x-y\lfloor\fracxy\rfloor\),那么我们先把答案加上......
  • cf1548c-solution
    CF1548CSolutionlink题意说人话就是每次给\(x\)求\(\displaystyle\sum_{i=1}^n\binom{3i}x\)。由于多组询问,考虑能不能生成函数。设\[\begin{aligned}f_k&=\sum_{i=1}^n\binom{3i}k\\F(x)&=\sum_{i=0}^\inftyf_{i}x^i\\&=\sum_{i=0}^\infty\sum_{j=1}^n\bin......