题目链接:https://codeforces.com/problemset/problem/1228/B
题意就不写了。
好久之前写过的一道题,大概有两个月了,今天看到韬哥在写,本想装一波教他一下,但是一上手就发现已经忘干净不会写了,赶紧再看了一遍之前的代码,现在又懂了,写一篇博客记录一下。
开两个数组记录下行和列的值,然后两层循环依次判断每个位置,如果当前的位置行和列序号不影响原图,也就是当前位置的行和列的序号都大于对应行列数组中存的值,那么当前位置就可以涂色,当然位置就有涂色和不涂色两种方案,所以方案数乘二即可,如果当前位置的数组中的值已经互相矛盾,那么这个图无论怎么涂色都不合法,所以答案为0。
#include<stdio.h>
const int mod=1e9+7;
const int N=1050;
int r[N],c[N];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;++i)
scanf("%d",&r[i]);
for(int i=0;i<m;++i)
scanf("%d",&c[i]);
int ans=1;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(i>c[j]&&j>r[i]){
ans=ans*2%mod;
}
if((i==c[j]&&j<r[i])||(j==r[i]&&i<c[j])){
printf("%d\n",0);
return 0;
}
}
}
printf("%d\n",ans);
return 0;
}
比赛的时候还写过另一种做法,但是写法比较复杂
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[1005];
int b[1005];
int map[1005][1005];
typedef long long ll;
const ll mod=1e9+7;
ll quick_mod(ll a,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++) {
scanf("%d",&a[i]);
for (int j=1; j<=a[i]; j++) {
map[i][j]=1;
}
map[i][a[i]+1]=-1;
}
int flag=1;
for (int i=1; i<=m; i++) {
scanf("%d",&b[i]);
for(int j=1; j<=b[i]; j++) {
if(map[j][i]==-1) {
flag=0;
}
map[j][i]=1;
}
if(map[b[i]+1][i]==1) {
flag=0;
}
map[b[i]+1][i]=-1;
}
if(flag==0) {
printf("0\n");
return 0;
}
int s=0;
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
if(map[i][j]==0) {
s++;
}
}
}
ll ans=quick_mod(2,s);
printf("%lld\n",ans);
}