Educational Codeforces Round 8 E. Zbazi in Zeydabad 树状数组
E. Zbazi in Zeydabad
题目连接:
http://www.codeforces.com/contest/628/problem/D
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<bits/stdc++.h>
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<int>over[maxn];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int val)
{
x++;
for(int i=x;i<maxn;i+=lowbit(i))
a[i]+=val;
}
int query(int x)
{
x++;
int ans=0;
for(int i=x;i;i-=lowbit(i))
ans+=a[i];
return ans;
}
long long solve(int x,int y)
{
memset(a,0,sizeof(a));
int L = min(m-y,x+1);
for(int i=0;i<maxn;i++)over[i].clear();
int last=-1;
long long ret = 0;
for(int i=0;i<L;i++)
{
int nx = x-i;
int ny = y+i;
if(s[nx][ny]=='.')
last=i;
else{
update(i,1);over[i+r[nx][ny]-1].push_back(i);
int len = min(l[nx][ny],i-last);
ret+=query(i)-query(i-len);
}
for(int j=0;j<over[i].size();j++)
update(over[i][j],-1);
}
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",s[i]);
for(int i=0;i<n;i++)
{
l[i][0]=s[i][0]=='z';
for(int j=1;j<m;j++)
if(s[i][j]=='z')l[i][j]=l[i][j-1]+1;
r[i][m-1]=s[i][m-1]=='z';
for(int j=m-2;j>=0;j--)
if(s[i][j]=='z')r[i][j]=r[i][j+1]+1;
}
long long ans = 0;
for(int i=0;i<n;i++)
ans+=solve(i,0);
for(int i=1;i<m;i++)
ans+=solve(n-1,i);
printf("%lld\n",ans);
}
Educational Codeforces Round 8 E. Zbazi in Zeydabad 树状数组的更多相关文章
- CF Educational Codeforces Round 10 D. Nested Segments 离散化+树状数组
题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...
- Educational Codeforces Round 10 D. Nested Segments 离线树状数组 离散化
D. Nested Segments 题目连接: http://www.codeforces.com/contest/652/problem/D Description You are given n ...
- Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】
任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...
- Codeforces 628E Zbazi in Zeydabad 树状数组
题意:一个n*m的矩阵,要么是 . 要么是 z ,问可以形成几个大z 分析:(直接奉上官方题解,我感觉说的实在是太好了) Let's precalculate the values zlij, zri ...
- Codeforces Round #401 (Div. 1) C(set+树状数组)
题意: 给出一个序列,给出一个k,要求给出一个划分方案,使得连续区间内不同的数不超过k个,问划分的最少区间个数,输出时将k=1~n的答案都输出 比赛的时候想的有点偏,然后写了个nlog^2n的做法,T ...
- Educational Codeforces Round 40 G. Castle Defense (二分+滑动数组+greedy)
G. Castle Defense time limit per test 1.5 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- CodeForces 380C Sereja and Brackets(扫描线+树状数组)
[题目链接] http://codeforces.com/problemset/problem/380/C [题目大意] 给出一个括号序列,求区间内左右括号匹配的个数. [题解] 我们发现对于每个右括 ...
- Codeforces 703D Mishka and Interesting sum 离线+树状数组
链接 Codeforces 703D Mishka and Interesting sum 题意 求区间内数字出现次数为偶数的数的异或和 思路 区间内直接异或的话得到的是出现次数为奇数的异或和,要得到 ...
随机推荐
- perl6 拖库脚本
#注入点: #https://fei.sg/shop/products.php?action=content&id=-23 #check mysql column_name of the sq ...
- python自动开发之第二十四天(Django)
一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...
- 64_f1
FUR-0.4.6-13.fc26.x86_64.rpm 13-Feb-2017 23:32 45882 Falcon-0.9.6.8-11.fc26.i686.rpm 13-Feb-2017 23: ...
- 动画基础--基于Core Animation(2)
参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1)提到了图层的基本概念以及可动画参数几何学等知识. 本 ...
- elasticsearch批量索引数据示例
示例数据文件document.json(index表示在索引中增加或替换现有文档,create表示如果文档不存在则添加文档,delete表示删除文档): { "index": { ...
- HDU-2819
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- jboss和tomcat有什么不同
2.tomcat 是 JSP/Servlet 容器jboss 是 JEE 容器,JEE 包括JSP/Servlet,JMS, EJB,JAX-WS,JAX-RS,CDI等等, tomcat是完全开源, ...
- Django Rest Framework用户访问频率限制
一. REST framework的请求生命周期 基于rest-framework的请求处理,与常规的url配置不同,通常一个django的url请求对应一个视图函数,在使用rest-framewor ...
- C语言 反序打印字符串中的单词
int main() { char *str = "see you later"; int r = strlen(str); char * p = str; ; while(*st ...
- Elements in iteration expect to have 'v-bind:key' directives.' 提示错误如何解决?
在学习vue过程中遇到Elements in iteration expect to have 'v-bind:key' directives.' 这个错误,查阅资料得知Vue 2.2.0+的版本里, ...