框架

「LibreOJ β Round #4」框架

内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
 
题目描述

有一个 n×mn\times mn×m 的矩形框架,但其中有些边被删除了。qmqmqm想知道剩余部分中还有多少完整的正方形。

输入格式

输入第一行包含两个正整数 n,mn,mn,m。

之后 nnn 行,每行 m−1m-1m1 个空格隔开的整数为 000 或 111,表示横向边的存在情况。

之后 n−1n-1n1 行,每行 mmm 个空格隔开的整数为 000 或 111,表示竖向边的存在情况。

输出格式

输出一行一个整数表示剩余完整正方形的个数。

样例
样例输入
3 3
1 1
0 1
1 1
1 1 1
1 0 1
样例输出
2
样例解释

剩余框架为

a.png

数据范围与提示

2≤n,m≤1032 \leq n,m \leq 10^32n,m103​​

分析:要求正方形的个数;

   直接暴力是n^4的,考虑bitset可以优化掉其中两维;

   枚举两行n^2,然后bitset快速判断即可;

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <cassert>
#include <ctime>
#define rep(i,m,n) for(i=m;i<=(int)n;i++)
#define inf 0x3f3f3f3f
#define mod 998244353
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
#define ls (rt<<1)
#define rs (rt<<1|1)
#define all(x) x.begin(),x.end()
const int maxn=1e3+10;
const int N=4e5+10;
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qmul(ll p,ll q,ll mo){ll f=0;while(q){if(q&1)f=(f+p)%mo;p=(p+p)%mo;q>>=1;}return f;}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
int n,m,k,t;
bitset<maxn>st[maxn][maxn],h[maxn];
int main(){
    int i,j;
    scanf("%d%d",&n,&m);
    rep(i,1,n)rep(j,1,m-1)
    {
        scanf("%d",&k);
        st[i][1][j]=k;
    }
    rep(i,1,n)rep(j,2,m)
    {
        st[i][j]=(st[i][j-1]&(st[i][j-1]>>1));
    }
    rep(i,1,n-1)rep(j,1,m)
    {
        scanf("%d",&k);
        h[i][j]=k;
    }
    bitset<maxn>tmp;
    int ret=0;
    rep(i,1,n)rep(j,i+1,n)
    {
        if(j==i+1)tmp=h[i];
        else tmp&=h[j-1];
        ret+=(tmp&(tmp>>(j-i))&st[i][j-i]&st[j][j-i]).count();
    }
    printf("%d\n",ret);
    return 0;
}

转载于:https://www.cnblogs.com/dyzll/p/7737557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值