HZOI20190816模拟23题中,如何用gcd函数处理mine、water问题?

更新于
2026-07-28 07:28:58
20阅读来源:SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1090个文字,预计阅读时间需要5分钟。

HZOI20190816模拟23题中,如何用gcd函数处理mine、water问题?

A:Amine 只是一个简单的 dp。博主太厉害了。

设 f[i][j],表示到达第 i 位,状态是 j 的方案数。

其中 $j \in [0,5]$,$f[j][0]=0$,$f[j][1]=1$,$f[j][2]=A$,$f[j][3]=A + mine$,$f[j][4]=A + mine + A$,$f[j][5]=A + mine + A + A$。

且 i-1 位是雷。

A:mine只是一个简单的dp。。。。是博主太蒻了。。。设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$j0表示填0,j1表示填1,且i-1位是雷;j2

A:mine

只是一个简单的dp。。。。是博主太蒻了。。。

设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$

j==0表示填0,j==1表示填1,且i-1位是雷;

HZOI20190816模拟23题中,如何用gcd函数处理mine、water问题?

j==2表示填2,j==3表示填雷,j==5表示填1,且i-1位不是雷

思考一下,得到方程:

      $f[i][4]=f[i-1][3]$ $f[i][1]=f[i-1][4]+f[i-1][0]$

      $f[i][3]=f[i-1][1]+f[i-1][2]+f[i-1][3]$ $f[i][0]=f[i-1][4]+f[i-1][0]$ $f[i][2]=f[i-1][3]$

然后就没什么了

#include#include#include#include#define int long longusing namespace std;const int MAXN=1e6+1;const int mod=1e9+7;int len,ans=0,f[2][5];char s[MAXN];signed main(){scanf("%s",s+1);len=strlen(s+1);if(s[1]==‘*‘) f[1][3]=1;else if(s[1]==‘1‘) f[1][1]=1;else if(s[1]==‘0‘) f[1][0]=1;else if(s[1]==‘?‘) f[1][3]=f[1][1]=f[1][0]=1;for(int i=2;i<=len;i++){f[iif(s[i]==‘?‘){f[if[if[if[if[i}else if(s[i]==‘1‘){f[if[i}else if(s[i]==‘*‘){f[i}else if(s[i]==‘0‘){f[i}else{f[i}}ans=((f[lenprintf("%lld\n",ans);return 0;}

B:water

一个块的高度就是从这个块走出矩形的所有路径上的最大值的最小值。

相邻块连边,权值为两块的较大值,矩形边界的块向矩形外连边,权值为 max(高度,0),

做最小生成树,然后每个点的积水高度就是这个点到根节点路径上的最大边权减去这个点的点权

#include#include#include#include#define MAXN 305#define inf 0x7fffffffusing namespace std;int n,m,a[MAXN][MAXN],dep[MAXN*MAXN];int calc(int i,int j){return (i-1)*m+j;}struct node{int fr,to,w,nxt;friend bool operator <(node a,node b){return a.w

C:gcd

并不是gcd,好像有mobius反演的内容,博主先咕了

本文共计1090个文字,预计阅读时间需要5分钟。

HZOI20190816模拟23题中,如何用gcd函数处理mine、water问题?

A:Amine 只是一个简单的 dp。博主太厉害了。

设 f[i][j],表示到达第 i 位,状态是 j 的方案数。

其中 $j \in [0,5]$,$f[j][0]=0$,$f[j][1]=1$,$f[j][2]=A$,$f[j][3]=A + mine$,$f[j][4]=A + mine + A$,$f[j][5]=A + mine + A + A$。

且 i-1 位是雷。

A:mine只是一个简单的dp。。。。是博主太蒻了。。。设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$j0表示填0,j1表示填1,且i-1位是雷;j2

A:mine

只是一个简单的dp。。。。是博主太蒻了。。。

设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$

j==0表示填0,j==1表示填1,且i-1位是雷;

HZOI20190816模拟23题中,如何用gcd函数处理mine、water问题?

j==2表示填2,j==3表示填雷,j==5表示填1,且i-1位不是雷

思考一下,得到方程:

      $f[i][4]=f[i-1][3]$ $f[i][1]=f[i-1][4]+f[i-1][0]$

      $f[i][3]=f[i-1][1]+f[i-1][2]+f[i-1][3]$ $f[i][0]=f[i-1][4]+f[i-1][0]$ $f[i][2]=f[i-1][3]$

然后就没什么了

#include#include#include#include#define int long longusing namespace std;const int MAXN=1e6+1;const int mod=1e9+7;int len,ans=0,f[2][5];char s[MAXN];signed main(){scanf("%s",s+1);len=strlen(s+1);if(s[1]==‘*‘) f[1][3]=1;else if(s[1]==‘1‘) f[1][1]=1;else if(s[1]==‘0‘) f[1][0]=1;else if(s[1]==‘?‘) f[1][3]=f[1][1]=f[1][0]=1;for(int i=2;i<=len;i++){f[iif(s[i]==‘?‘){f[if[if[if[if[i}else if(s[i]==‘1‘){f[if[i}else if(s[i]==‘*‘){f[i}else if(s[i]==‘0‘){f[i}else{f[i}}ans=((f[lenprintf("%lld\n",ans);return 0;}

B:water

一个块的高度就是从这个块走出矩形的所有路径上的最大值的最小值。

相邻块连边,权值为两块的较大值,矩形边界的块向矩形外连边,权值为 max(高度,0),

做最小生成树,然后每个点的积水高度就是这个点到根节点路径上的最大边权减去这个点的点权

#include#include#include#include#define MAXN 305#define inf 0x7fffffffusing namespace std;int n,m,a[MAXN][MAXN],dep[MAXN*MAXN];int calc(int i,int j){return (i-1)*m+j;}struct node{int fr,to,w,nxt;friend bool operator <(node a,node b){return a.w

C:gcd

并不是gcd,好像有mobius反演的内容,博主先咕了