CodeForces - 1228B

题目链接: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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值