题意,给出一个n行m列的矩阵

里面元素是0或者1

给出q个询问

a,b,c,d

求(a,b)到(c,d)有多少个由0组成的矩形

我们定义

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc3NTY5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">即为求(a,b)到(c,d)有多少个由0组成的矩形

对一个矩形来说

dp[a][b][c][d]=dp[a][b][c][d-1]+dp[a][b][c-1][d]-dp[a][b][c-1][d-1]+包括右下角(当前点)的矩形;

重点就在包括右下角(当前点c,d)的矩形。怎样计算这个

我们能够暴力扫描。须要nm的复杂度。乘上原有复杂度

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc3NTY5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">,,,已经会超过时限

也能够用一个VECTOR来记录1的位置。对我们扫描到的行,二分查找G[该行]中1的位置(在第b列到第d列间第一个1),然后依据相对位置再来计算,最坏查找次复杂度为

也能够状压整张图

我们要知道的是b列到d列中1的情况,我们把代表该行状态的数s先左位移再右位移到仅仅剩b列到d列的状态

然后作运算s&(-s)返回第一个1的位置比方。假设s是0101000,则返回8

为什么能这样?来看下是怎么回事

还是以s=0101000为例

负数即正数的补码,-s即是1010111+1=1011000

0101000

1011000 &

0001000

可是这里

会返回2^40

可是没关系。我们对返回的数模997(经測验没有地址冲突)

这样就能够把它丢到表里

vis[2^1]=1

vis[2^2]=2

vis[2^3]=3

...

vis[2^40]=40

这样就能够得到当前行中b到d列里从右往左第一个1的相对于第d列的位置

算下复杂度,全是几个O(1)的操作,大致为O(1)

说下我认为最厉害最省事的方法

CF上最短size的代码

是这么做的

记录每一个格子距离上一个1的距离d[i][j]



在找包括右下角(当前点c,d)的矩形的时候,我们取adder=min(记录数d[i][d],adder)(adder一開始是d-b+1),每次加上这个adder。从c行到a行(d[c][d]~d[a][d]),一直维护这个adder

O(1)且很方便

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int g[55][55];
int num[55][55];
int dp[55][55][55][55];
int main(){
#ifndef ONLINE_JUDGE
freopen("/home/rainto96/in.txt","r",stdin);
#endif int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%1d",&g[i][j]);
num[i][j]=num[i][j-1]+1;
if(g[i][j]==1)
num[i][j]=0;
}
for(int a=1;a<=n;a++)
for(int b=1;b<=m;b++)
for(int c=a;c<=n;c++)
for(int d=b;d<=m;d++){
int& now=dp[a][b][c][d]=dp[a][b][c][d-1]+dp[a][b][c-1][d]-dp[a][b][c-1][d-1];
int add=d-b+1;
for(int i=c;i>=a;i--){
add=min(add,num[i][d]);
now+=add;
}
}
for(int i=1;i<=q;i++){
int a,b,c,d;
cin>>a>>b>>c>>d;
cout<<dp[a][b][c][d]<<endl;
}
}

CF 372B Counting Rectangles is Fun [dp+数据维护]的更多相关文章

  1. Codeforces 372B Counting Rectangles is Fun:dp套dp

    题目链接:http://codeforces.com/problemset/problem/372/B 题意: 给你一个n*m的01矩阵(1 <= n,m <= 40). 然后有t组询问( ...

  2. Codeforces 372B Counting Rectangles is Fun

    http://codeforces.com/problemset/problem/372/B 题意:每次给出一个区间,求里面有多少个矩形 思路:预处理,sum[i][j][k][l]代表以k,l为右下 ...

  3. Codeforces Round #219 (Div. 2) D. Counting Rectangles is Fun 四维前缀和

    D. Counting Rectangles is Fun time limit per test 4 seconds memory limit per test 256 megabytes inpu ...

  4. Counting Rectangles

    Counting Rectangles Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1043 Accepted: 546 De ...

  5. Project Euler 85 :Counting rectangles 数长方形

    Counting rectangles By counting carefully it can be seen that a rectangular grid measuring 3 by 2 co ...

  6. UVA - 10574 Counting Rectangles

    Description Problem H Counting Rectangles Input: Standard Input Output:Standard Output Time Limit: 3 ...

  7. UVA 10574 - Counting Rectangles(枚举+计数)

    10574 - Counting Rectangles 题目链接 题意:给定一些点,求可以成几个边平行于坐标轴的矩形 思路:先把点按x排序,再按y排序.然后用O(n^2)的方法找出每条垂直x轴的边,保 ...

  8. Codeforces 372 B. Counting Rectangles is Fun

    $ >Codeforces \space 372 B.  Counting Rectangles is Fun<$ 题目大意 : 给出一个 \(n \times m\) 的 \(01\) ...

  9. BSA基础数据维护

    平台 BSA基础数据维护 .扇区五个字段的内容 本来值为0,经过107上计算解析,得出正常的数值.然后106上报(200050),得到回复(200051). 查看回复数据,是否有错误.比如提示104 ...

随机推荐

  1. TCP心跳包

    所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已.代码就是每 隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息.如果服务器端几分钟后没有收到客户端信息则视客户端断开.比 ...

  2. 一步步教会你微信小程序的登录鉴权

    前言 为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口.乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态.本文就来手把手 ...

  3. win10 + vs2017 + vcpkg —— VC++ 打包工具

    vcpkg 是微软 C++ 团队开发的在 Windows 上运行的 C/C++ 项目包管理工具,可以帮助您在 Windows 平台上获取 C 和 C++ 库. vcpkg 自身也是使用 C++ 开发的 ...

  4. JavaScript之BOM和DOM

    前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...

  5. c++对象关系映射(ORM)框架

    ORM(Object Relational Mapping, 对象关系映射),用来将基于对象的数据结构映射到SQL的数据结构中,即将基于对象的数据映射到关系表中的字段,然后我们可以通过对象提供的接口来 ...

  6. 9.18[XJOI] NOIP训练36

    ***在休息了周末两天(好吧其实只有半天),又一次投入了学车的怀抱,重新窝在这个熟悉的机房 今日9.18(今天以后决定不写打卡了) 日常一日总结 一个昏昏欲睡的早晨 打了一套不知道是谁出的题目,空间限 ...

  7. Core篇——初探IdentityServer4(客户端模式,密码模式)

    Core篇——初探IdentityServer4(客户端模式,密码模式) 目录 1.Oatuth2协议的客户端模式介绍2.IdentityServer4客户端模式实现3.Oatuth2协议的密码模式介 ...

  8. 错误信息:getOutputStream() has already been called for this response

    原因(转): getOutputStream()和getWriter()这两个方法不能在一个请求内同时使用, 如果使用forward,这时将要跳转到的页面是要用getWriter()方法获得输出流把页 ...

  9. P1732 活蹦乱跳的香穗子

    题目描述 香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值 跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她 ...

  10. (转载)RxJava 与 Retrofit 结合的最佳实践

    RxJava 与 Retrofit 结合的最佳实践 作者:tough1985 感谢 DaoCloud 为作者提供的 500 RMB 写作赞助: 成为赞助方 /开始写作 前言 RxJava和Retrof ...