#include <stdio.h>
int max2(int a,int b)
{
return a>b?a:b;
}
int max3(int a,int b,int c)
{
int t=max2(a,b);
return t>c?t:c;
}
int main(int argc, char *argv[])
{
int n;
scanf("%d",&n);
int ma;
scanf("%d",&ma);
int a[100005];
for(int i=ma-1;i>=0;i--)
{
scanf("%d",&a[i]);
}
int mb;
scanf("%d",&mb);
int b[100005];
for(int i=mb-1;i>=0;i--)
{
scanf("%d",&b[i]);
}
int t=max2(ma,mb);
long long ans=0;
for(int i=t-1;i>=0;i--)
{
int m1=(i<ma)?a[i]:0;
int m2=(i<mb)?b[i]:0;
int x=max3(m1+1,m2+1,2);
ans=(ans*(long long)x+(long long)(m1-m2))%1000000007;
if(ans<0) ans+=1000000007;
}
printf("%lld",ans);
return 0;
}
统计子矩阵
cs复制代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n,m;
long long k;
int a[1000][1000];
scanf("%d %d %lld",&n,&m,&k);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
long long cnt=0;
long long col_sum[1000];
for(int top=0;top<n;top++)
{
for(int j=0;j<m;j++)
{
col_sum[j]=0;
}
for(int bottom=top;bottom<n;bottom++)
{
for(int j=0;j<m;j++)
{
col_sum[j]+=a[bottom][j];
}
int left=0;
long long current_sum=0;
for(int right=0;right<m;right++)
{
current_sum+=col_sum[right];
while(current_sum>k&&left<=right)
{
current_sum-=col_sum[left];
left++;
}
if(current_sum<=k)
{
cnt+=(long long)(right-left+1);
}
}
}
}
printf("%lld",cnt);
return 0;
}
积木画
cs复制代码
#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
const mod=1000000007;
int dp[10000010][3];
int main(int argc, char *argv[])
{
dp[0][2]=1;
dp[1][2]=1;
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
dp[i][0]=((ll)dp[i-1][1]+dp[i-2][2])%mod;
dp[i][1]=((ll)dp[i-1][0]+dp[i-2][2])%mod;
dp[i][2]=((ll)dp[i-1][2]+dp[i-1][0]+dp[i-1][1]+dp[i-2][2])%mod;
}
printf("%d",dp[n][2]);
return 0;
}
扫雷
cs复制代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n,m;
scanf("%d %d",&n,&m);
int a[1005][1005],b[1005][1005];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
int dx[]={1,1,1,-1,-1,-1,0,0};
int dy[]={1,-1,0,1,-1,0,1,-1};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]==1)
{
b[i][j]=9;
continue;
}
int cnt=0;
for(int k=0;k<8;k++)
{
int x=i+dx[k],y=j+dy[k];
if(x>=0&&y>=0&&x<n&&y<m)
{
if(a[x][y]==1) cnt++;
}
}
b[i][j]=cnt;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}