B
思路
- 我们发现对于每个数只有 1<<10 种状态,直接Dp 即可
- 没有想该题(甩锅)
C
思路
- 同时由于题意,我们发现每个循环的上下界只会有一个被其他循环限制
- 很容易发现每个循环可以形成一个拓扑序(或者树形的结构)
- 那么,我们可以用Dp对状态进行量化,我们用Dp记录第i层(循环)次数(循环的次数)为j时的状态
- 为了提高效率,我们可以用前缀和优化即用Dp[i][j]记录第i层次数小于等于j的答案
- 转移的方程就很简单了
void dfs(int x){
for(int i=l[x];i<=r[x];i++)dp[x][i]=1;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
dfs(y);
for(int j=l[x];j<=r[x];j++){
int L=l[y],R=r[y];
if(cmd[y]==1)L=j;
if(cmd[y]==2)R=j;
if(L<=R)Pro(dp[x][i],dp[y][R]-dp[y][L-1]+P);
else dp[x][j]=0;
}
}
for(int i=l[x];i<=r[x];i++)Add(dp[x][i],dp[x][i-1]);
}