博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 8 E. Zbazi in Zeydabad 树状数组
阅读量:6913 次
发布时间:2019-06-27

本文共 1997 字,大约阅读时间需要 6 分钟。

E. Zbazi in Zeydabad

题目连接:

Description

A tourist wants to visit country Zeydabad for Zbazi (a local game in Zeydabad).

The country Zeydabad is a rectangular table consisting of n rows and m columns. Each cell on the country is either 'z' or '.'.

The tourist knows this country is named Zeydabad because there are lots of ''Z-pattern"s in the country. A ''Z-pattern" is a square which anti-diagonal is completely filled with 'z' and its upper and lower rows are also completely filled with 'z'. All other cells of a square can be arbitrary.

Note that a ''Z-pattern" can consist of only one cell (see the examples).

So he wants to count the number of ''Z-pattern"s in the country (a necessary skill for Zbazi).

Now your task is to help tourist with counting number of ''Z-pattern"s.

As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use gets/scanf/printf instead of getline/cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.

Input

The first line contains two integers n, m (1 ≤ n, m ≤ 3000) — the number of rows and columns respectively.

Each of the next n lines contains m characters 'z' or '.' — the description of Zeydabad.

Output

Print the only integer a — the number of ''Z-pattern"s in Zeydabad.

Sample Input

4 4

zzzz
zzz.
.z..
zzzz

Sample Output

16

Hint

题意

给你一个n*m的矩阵,然后问你里面有多少个z

题解:

数据结构

首先我们对于每一个点维护一个l[i][j],r[i][j],表示这个点往左边最多延伸多少,往右边最多延伸多少

我们去维护每一个对角线就好了,我们从左下角跑到右上角

我们update(i,1)表示这个位置当前是可以的,他对于上面的i+r[i][j]-1个都是可以更新的

他这个点的贡献就是query(i)-query(i-len),len = l[i][j]和i-last的最小值,显然他可以和下面len个进行组合

然后这样去跑就好了

我讲的比较抽象,还是看代码吧……

代码

#include
using namespace std;const int maxn = 3e3+5;int a[maxn],n,m;char s[maxn][maxn];int l[maxn][maxn],r[maxn][maxn];vector
over[maxn];int lowbit(int x){ return x&(-x);}void update(int x,int val){ x++; for(int i=x;i
=0;j--) if(s[i][j]=='z')r[i][j]=r[i][j+1]+1; } long long ans = 0; for(int i=0;i

转载地址:http://pencl.baihongyu.com/

你可能感兴趣的文章
【c#】BackgroundWorker类的使用方法
查看>>
【NetApp】启用smb2.0
查看>>
001作业题
查看>>
关于实习
查看>>
叠加等边三角形
查看>>
【对拍√】
查看>>
重载,继承,重写,多态的区别
查看>>
NUnit笔记
查看>>
maven添加sqlserver的jdbc驱动包
查看>>
POJ 1426 Find The Multiple
查看>>
WPF入门教程系列五——Window 介绍
查看>>
数字图像处理中所用数学工具4---集合、逻辑操作与模糊集合
查看>>
网页换肤
查看>>
[BZOJ3751/NOIP2014]解方程
查看>>
【Java例题】3.5 级数之和
查看>>
silverlight多国语言研究
查看>>
开发--省级三联动,简单的代码,但是功能不差
查看>>
赋值法
查看>>
单词积累(Unity)
查看>>
P4769 [NOI2018]冒泡排序(dp)
查看>>