其他分享
首页 > 其他分享> > 【洛谷6630】[ZJOI2020] 传统艺能(动态规划+矩乘)

【洛谷6630】[ZJOI2020] 传统艺能(动态规划+矩乘)

作者:互联网

点此看题面


毕竟是半年前考场上切掉的题目啊。。。

由于没有考场代码,这篇博客就一直坑着,直到今天下定决心重写一遍。

应该说实力还是没有太大退步,稍微想了一下便推出来了,接着轻松过样例,然后就一遍\(A\)掉了。

套路设立状态

真的想不到ZJOI会抄自己的题目,发现前一年的Day1T2(【洛谷5280】[ZJOI2019] 线段树)和今年的Day1T2完全就是一个套路,甚至今年这题可能还要更简单。

按照套路,对于一个点\(x\)(假设它对应区间为\([l,r]\),其父节点对应区间为\([fl,fr]\))我们设立三个状态:

方便起见,我们定义\(S(x)=\frac{x\times(x+1)}2\)。

令\(T=S(n)\)(一次操作的总方案数),\(P=S(l-1)+S(n-r)\)(和当前区间无交的方案数),\(A=l\times (n-r+1)\)(包含当前区间的方案数,也即当前点及其祖先中的某一个点作为终止节点的方案数)。

并类似地定义\(Pf=S(fl-1)+S(n-fr),Af=fl\times(n-fr+1)\)。

然后考虑状态之间的转移:

\(k\)这么大自然而然想到矩乘优化,于是这道题就做完了。

代码:\(O(27nlogk)\)

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
#define X 998244353
using namespace std;
int n,k;I int QP(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}
struct M
{
	int a[3][3];I M() {memset(a,0,sizeof(a));}
	I int* operator [] (CI x) {return a[x];}
	I Con int* operator [] (CI x) Con {return a[x];}
	I M operator * (Con M& o) Con//矩阵乘法
	{
		M t;RI i,j,k;for(i=0;i^3;++i) for(j=0;j^3;++j)
			for(k=0;k^3;++k) t[i][j]=(1LL*a[i][k]*o[k][j]+t[i][j])%X;return t;
	}
}U,t;
int ans;I void Solve(CI l,CI r,CI fl=0,CI fr=n+1)
{
	#define S(x) (1LL*(x)*((x)+1)/2%X)
	#define G(x,y) (1LL*(x)*(n-(y)+1)%X)
	RI T=S(n),P=(S(l-1)+S(n-r))%X,A=G(l,r),Pf=(S(fl-1)+S(n-fr))%X,Af=G(fl,fr);
	U[0][0]=(T-A+X)%X,U[0][2]=(A-Af+X)%X,U[0][1]=Af,//构造转移矩阵
	U[1][0]=(T-P-A+X)%X,U[1][2]=((0LL+P+A-Pf-Af)%X+X)%X,U[1][1]=(Pf+Af)%X,
	U[2][0]=(T-P-A+X)%X,U[2][2]=(P+A)%X,U[2][1]=0;
	RI y=k;(t=M())[0][0]=1;W(y) y&1&&(t=t*U,0),U=U*U,y>>=1;ans=(ans+t[0][2])%X;//矩阵快速幂,ans统计答案
	if(l==r) return;RI x;scanf("%d",&x),Solve(l,x,l,r),Solve(x+1,r,l,r);//递归
}
int main()
{
	return scanf("%d%d",&n,&k),Solve(1,n),printf("%d\n",1LL*ans*QP(QP(S(n),k),X-2)%X),0;//期望=总和/总方案数
}

标签:矩乘,rightarrow0,Af,int,艺能,区间,洛谷,RI,define
来源: https://www.cnblogs.com/chenxiaoran666/p/Luogu6630.html