sm2025 模拟赛6 (2025.9.22)
T1 四色球 (easy,80%)
link / 弱化版
思路
考虑贪心。我们肯定希望把能先换了的球换掉,这样肯定优。设 (a,b)(a,b)(a,b) 表示此时有一个颜色为 aaa 的球占用了本来应为颜色 bbb 的球的位置。那么形如 (a,b)(a,b)(a,b) 和 (b,a)(b,a)(b,a) (二元环)可以用 111 的代价交换使其合法。然后将形如 (a,b),(b,c),(c,a)(a,b),(b,c),(c,a)(a,b),(b,c),(c,a) 这样的球(三元环)用 222 代价交换……按环的大小依次交换即可。
反思
忘记三四环要分开交换了,宕机。
T2 迷宫(mid-,30%)
link
思路
很 树形dp 。按位统计答案。最后算 [l,r][l,r][l,r] 的答案不好算,前缀和转化为 [1,r]−[1,l−1][1,r]-[1,l-1][1,r]−[1,l−1] 。设 fi,j,0/1,0/1f_{i,j,0/1,0/1}fi,j,0/1,0/1 表示到第 iii 层,已经改变了 jjj 次方向,当前 是(1)(1)(1)否(0)(0)(0) 是按规定的方向,是否到达上界 ,此状态下的答案。分讨转移即可。
反思
二进制题注意往拆位计算上想!
被方向绕晕了,分讨要清晰!!
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e3+5,mod=1e9+7;int n,k;
ll f[maxn][maxn][2][2],g[maxn][maxn][2][2];
string dt;
ll Solve(string st){memset(f,0,sizeof(f)); memset(g,0,sizeof(g));//!f[1][0][0][1]=f[1][0][1][1]=g[1][0][0][1]=g[1][0][1][1]=1;for(int i=2;i<=n;i++)for(int j=0;j<=k;j++){if(st[i]=='1'){if(dt[i]=='L'){//f[i][j][0/1][0/1]:到第 i 层,已经改变了 j 次方向,当前 是(1)否(0) 是规定的方向,是否到达上界 f[i][j][0][0]=(f[i-1][j][0][0]+f[i-1][j][0][1])%mod*2%mod;f[i][j][1][0]=(f[i-1][j][1][0]*2%mod+g[i-1][j][1][0])%mod;f[i][j][1][1]=(f[i-1][j][1][1]*2%mod+g[i-1][j][1][1])%mod;g[i][j][0][0]=(g[i-1][j][0][0]+g[i-1][j][0][1])%mod;g[i][j][1][0]=g[i-1][j][1][0];g[i][j][1][1]=g[i-1][j][1][1];if(j){(f[i][j][0][0]+=(f[i-1][j-1][1][0]+f[i-1][j-1][1][1])%mod*2%mod)%=mod;(f[i][j][1][0]+=(f[i-1][j-1][0][0]*2%mod+g[i-1][j-1][0][0])%mod)%=mod;(f[i][j][1][1]+=(f[i-1][j-1][0][1]*2%mod+g[i-1][j-1][0][1])%mod)%=mod;(g[i][j][0][0]+=(g[i-1][j-1][1][0]+g[i-1][j-1][1][1])%mod)%=mod;(g[i][j][1][0]+=g[i-1][j-1][0][0])%=mod;(g[i][j][1][1]+=g[i-1][j-1][0][1])%=mod;}}else{f[i][j][1][0]=(f[i-1][j][1][0]+f[i-1][j][1][1])%mod*2%mod;f[i][j][0][0]=(f[i-1][j][0][0]*2%mod+g[i-1][j][0][0])%mod;f[i][j][0][1]=(f[i-1][j][0][1]*2%mod+g[i-1][j][0][1])%mod;g[i][j][1][0]=(g[i-1][j][1][0]+g[i-1][j][1][1])%mod;g[i][j][0][0]=g[i-1][j][0][0];g[i][j][0][1]=g[i-1][j][0][1];if(j){(f[i][j][1][0]+=(f[i-1][j-1][0][0]+f[i-1][j-1][0][1])%mod*2%mod)%=mod;(f[i][j][0][0]+=(f[i-1][j-1][1][0]*2%mod+g[i-1][j-1][1][0])%mod)%=mod;(f[i][j][0][1]+=(f[i-1][j-1][1][1]*2%mod+g[i-1][j-1][1][1])%mod)%=mod;(g[i][j][1][0]+=(g[i-1][j-1][0][0]+g[i-1][j-1][0][1])%mod)%=mod;(g[i][j][0][0]+=g[i-1][j-1][1][0])%=mod;(g[i][j][0][1]+=g[i-1][j-1][1][1])%=mod;} }}else{if(dt[i]=='L'){f[i][j][0][0]=f[i-1][j][0][0]*2%mod;f[i][j][0][1]=f[i-1][j][0][1]*2%mod;f[i][j][1][0]=(f[i-1][j][1][0]*2%mod+g[i-1][j][1][0])%mod;g[i][j][0][0]=g[i-1][j][0][0];g[i][j][0][1]=g[i-1][j][0][1];g[i][j][1][0]=g[i-1][j][1][0];if(j){(f[i][j][0][0]+=f[i-1][j-1][1][0]*2%mod)%=mod;(f[i][j][0][1]+=f[i-1][j-1][1][1]*2%mod)%=mod;(f[i][j][1][0]+=(f[i-1][j-1][0][0]*2%mod+g[i-1][j-1][0][0])%mod)%=mod;(g[i][j][0][0]+=g[i-1][j-1][1][0])%=mod;(g[i][j][0][1]+=g[i-1][j-1][1][1])%=mod;(g[i][j][1][0]+=g[i-1][j-1][0][0])%=mod;}}else{f[i][j][1][0]=f[i-1][j][1][0]*2%mod;f[i][j][1][1]=f[i-1][j][1][1]*2%mod;f[i][j][0][0]=(f[i-1][j][0][0]*2%mod+g[i-1][j][0][0])%mod;g[i][j][1][0]=g[i-1][j][1][0];g[i][j][1][1]=g[i-1][j][1][1];g[i][j][0][0]=g[i-1][j][0][0];if(j){(f[i][j][1][0]+=f[i-1][j-1][0][0]*2%mod)%=mod;(f[i][j][1][1]+=f[i-1][j-1][0][1]*2%mod)%=mod;(f[i][j][0][0]+=(f[i-1][j-1][1][0]*2%mod+g[i-1][j-1][1][0])%mod)%=mod;(g[i][j][1][0]+=g[i-1][j-1][0][0])%=mod;(g[i][j][1][1]+=g[i-1][j-1][0][1])%=mod;(g[i][j][0][0]+=g[i-1][j-1][1][0])%=mod;}}}}return (f[n][k][0][0]+f[n][k][0][1]+f[n][k][1][0]+f[n][k][1][1])%mod;
}string a,b;
int main(){freopen("maze.in","r",stdin);freopen("maze.out","w",stdout);cin>>n>>k>>dt>>a>>b; dt=" "+dt,a=" "+a,b=" "+b;for(int i=a.size()-1;i>=1;i--){if(a[i]=='1'){a[i]='0';break;}else a[i]='1';}cout<<(Solve(b)-Solve(a)+mod)%mod;return 0;
}
T3 幂
link