HHUOJ_1054: 撸猫狂魔

HHUOJ_1054: 撸猫狂魔

题目描述

zyyyyy是一个二刺猿。虽然他没有九十八亿,但是他坚信可爱即正义,所以他特别喜欢撸猫。
今天他为了让猫乖乖的被撸带了很多很多猫粮,猫粮被摆成网格图,于是一大群白猫为了吃猫粮也成了网格图。
等它们吃的开心了zyyyyy就开始撸她们。当他撸某只猫的时候,这只猫所在的行和列的猫虽然在吃东西但还是会被吓得变色(白猫变黑猫,黑猫变白猫),而这只猫因为惊吓过度就变了两次色(相当于不变色)。
撸了k次以后zyyyyy心满意足,不过现在他想知道自己闯了多大的祸。。。因为原来这些猫都是白的,现在有很多变成黑的了。定义整个网格图的黑色值等于所有行的黑色值相乘,一行的黑色值是这行黑猫的个数。不过黑色值可能太大了,为了避免他倍受打击我们还是告诉他黑色值模1000000007的值吧。。。

输入

第一行三个整数,n,m,k。表示行数,列数,撸猫次数。
接着k行每行两个整数,x,y。表示这次撸的是x行y列的猫 (可以重复撸)
n,m <= 1000
k <= 500000
1<=x<=n
1<=y<=m

输出

一个整数,表示黑色值模1000000007的值。

样例输入

5 4 2
3 3
3 2

样例输出

32

思路

拿到题的第一反应是开一个二维数组保存数据,代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int rec[1010][1010];

int main(){
    long long ans = 1;
    const int mod = 1e9+7;
    int n, m, k;
    cin>>n>>m>>k;
    memset(rec, 0, sizeof(rec));
    while(k--){
        int x, y;
        cin>>x>>y;
        for(int i=1; i<=n; i++){
            rec[x][i]++;
        }
        for(int i=1; i<=n; i++){
            rec[i][y]++;
        }
    }
    for(int i=1; i<=n; i++){
        int tmp = 0;
        for(int j=1; j<=m; j++){
            tmp += rec[i][j]%2;
        }
        ans = (ans%mod*tmp%mod) % mod;
    }
    cout<<ans<<endl;
    return 0;
}

但是WA,不知道为啥…希望大佬能解答一下…
下面换了一种思路,用两个一维数组row[1010], col[1010]保存数据
为什么可以用两个一维数组代替二维数组呢?
因为这里的操作每次都是以一行或者一列为单位操作的,也就是说,每次一定是变该行全部数据++,或者该列全部数据++,不可能出现该行或者该列只有几个数字++!
下面是该思路的AC代码:

代码

#include <iostream>
using namespace std;
int row[1010];
int col[1010];

int main(){
    int n, m, k;//n行 m列 
    long long ans = 1;//必须用long long
    const int mod = 1e9+7;
    cin>>n>>m>>k;
    for(int i=1; i<=n; i++){
        row[i] = 0;//白色0
    }
    for(int j=1; j<=m; j++){
        col[j] = 0;//白色0
    }
    while(k--){
        int x, y;
        cin>>x>>y;
        row[x]++;//当前行+1,奇数时为黑猫 
        col[y]++;//当前列+1,偶数时为白猫 
    }
    for(int i=1; i<=n; i++){
        int tmp = 0;//存放当前行的黑猫值 
        for(int j=1; j<=m; j++){
            tmp += (row[i]+col[j])%2;
        }
        ans = (ans%mod * tmp%mod) % mod;
    }
    cout<<ans<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值