[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;
}
夜畔流离回,暗叹永无殿。
独隐万花翠,空寂亦难迁。
千秋孰能为,明灭常久见。
但得心未碎,踏遍九重天。