[ARC074C] RGB Sequence

\(\text{Problem}:\)[ARC074C] RGB Sequence

\(\text{Solution}:\)editorial

\(F_{i,j,k}\) 表示当涂了前 \(x=\max\{i,j,k\}\) 个格子,三种颜色最后一次出现的位置分别为 \(i,j,k\),且满足 \(r_{i}\leq x\) 的所有限制时的答案。特殊的,如果一种颜色没有出现过,那么 \(i/j/k=0\),初始状态易知为 \(F_{0,0,0}=1\)。有转移:

\(F_{i,j,k}\rightarrow F_{x+1,j,k},F_{i,x+1,k},F_{i,j,x+1}\)

如果 \((i,j,k)\) 不满足限制,那么 \(F_{i,j,k}=0\)。考虑如果当前 \(F_{i,j,k}\) 不为 \(0\),说明 \(x-1\) 这个位置一定是满足限制。那么只需要考虑 \(r_{i}=x\) 的所有限制即可。时间复杂度为 \(O(n^{3}+n^{2}m)\)

\(\text{Code}:\)

#include <bits/stdc++.h>
#pragma GCC optimize(3)
//#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
using namespace std; const int N=310, Mod=1e9+7;
inline int read()
{
	int s=0, w=1; ri char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
	return s*w;
}
int n,m,F[N][N][N],Ans;
vector<pair<int,int> > q[N];
signed main()
{
	n=read(), m=read();
	for(ri int i=1;i<=m;i++)
	{
		int l,r,x;
		l=read(), r=read(), x=read();
		q[r].eb(mk(l,x));
	}
	F[0][0][0]=1;
	for(ri int i=0;i<=n;i++)
	for(ri int j=0;j<=n;j++)
	for(ri int k=0;k<=n;k++)
	{
		int g=max(max(i,j),k);
		for(auto x:q[g])
		{
			int tt=(i>=x.fi)+(j>=x.fi)+(k>=x.fi);
			if(tt^x.se) { F[i][j][k]=0; break; }
		}
		if(!F[i][j][k]) continue;
		if(g==n) { (Ans+=F[i][j][k])%=Mod; continue; }
		(F[g+1][j][k]+=F[i][j][k])%=Mod;
		(F[i][g+1][k]+=F[i][j][k])%=Mod;
		(F[i][j][g+1]+=F[i][j][k])%=Mod;
	}
	printf("%d\n",Ans);
	return 0;
}
posted @ 2021-02-25 15:09  zkdxl  阅读(48)  评论(0编辑  收藏  举报