Educational Codeforces Round 8(E. Zbazi in Zeydabad(树状数组优化))★ ★

转载 2016年08月31日 16:38:57

题意:一个n*m矩阵, 里面的格子除了'z'就是'.',问有多少个z形图案。

思路:因为n和m很大, 即使n^3复杂度也会超时。  如果按照最朴素的方法, 我们可以处理一下前缀和, 处理出一个格子向左l[i][j]、向右r[i][j]、斜向左下lr[i][j]连着的z到哪里为止, 这样我们用n^2复杂度枚举每一个格子作为z形图案的右上角,取min(l[i][j], lr[i][j]), 就可以立刻知道这个z形的最左下角到哪里, 然后在这个对角线上扫一遍, 看看向右最远是不是符合条件,复杂度n^3。  我们注意到, 最后一步是处理一个对角线区间上的问题。  这其实可以用树状数组快速累加和。

我们只需要从右向左枚举每一列, 将以这一列为最右端的线段最左端加进树状数组, 那么我们再枚举这一列的所有点作为Z形的右上角, 算出左下角。  由于只有同一对角线上的行加列相同, 所以以此为树状数组编号, 开n + m棵树状数组, 就可以快速累加在这个对角线上的满足列介于上面那一横的范围内的下面那一横的数量了。 又以为从右向左枚举列, 所以先加的一定满足之后的。


#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF  0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 3100
#define MOD 1000000007

int T,n,m, bit[maxn*2][maxn],l[maxn][maxn];
int lr[maxn][maxn],r[maxn][maxn];
long long ans = 0;
struct node
{
    int x, y;
};
vector<node> g[maxn];
char s[maxn][maxn];

int sum(int i, int x)
{
    int ans = 0;
    while(x > 0)
    {
        ans += bit[i][x];
        x -= x & -x;
    }
    return ans;
}
void add(int i, int x, int d)
{
    while(x <= m)
    {
        bit[i][x] += d;
        x += x & -x;
    }
}
void pre()
{
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(s[i][j] == 'z')
                l[i][j] = l[i][j-1] + 1;
            else
                l[i][j] = 0;
        }
        for(int j = m; j >= 1; j--)
        {
            if(s[i][j] == 'z')
                r[i][j] = r[i][j+1] + 1;
            else
                r[i][j] = 0;
        }
    }
    for(int i = n; i >= 1; i--)
    {
        for(int j = 1; j <= m; j++)
        {
            if(s[i][j] != 'z')
            {
                lr[i][j] = 0;
                continue;
            }
            if(j-1 >= 1 && i+1 <= n)
                lr[i][j] = lr[i+1][j-1] + 1;
            else
                lr[i][j] = 1;
        }
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            g[j + r[i][j] - 1].push_back(node{i,j});
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++)
        scanf("%s",s[i]+1);
    ans = 0;
    pre();
    for(int j = m; j >= 1; j--)
    {
        int len = g[j].size();
        for(int i = 0; i < len; i++)
        {
            int x = g[j][i].x, y = g[j][i].y;
            add(x+y, y, 1);
        }
        for(int i = 1; i <= n; i++)
        {
            if(s[i][j] != 'z')
                continue;
            int len = min(l[i][j], lr[i][j]);
            ans += sum(j+i, j) - sum(i+j, j-len);
        }
    }
    printf("%I64d\n",ans);
    return 0;
}


Educational Codeforces Round 8(E. Zbazi in Zeydabad(树状数组优化))

题目链接:点击打开链接 题意:一个n*m矩阵, 里面的格子除了'z'就是'.',问有多少个z形图案。 思路:因为n和m很大, 即使n^3复杂度也会超时。  如果按照最朴素的方法, 我们可以处理一下...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2016年02月22日 21:24
  • 1381

Codeforces Educational Codeforces Round 37 E

You are given an undirected graph consisting of n vertices and edges. Instead of giving you the edg...
  • yqdjl6
  • yqdjl6
  • 2018年02月03日 18:16
  • 47

Educational Codeforces Round 37 E. Connected Components?(bfs+思路)

E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabyt...
  • m0_37134257
  • m0_37134257
  • 2018年02月03日 09:56
  • 157

Educational Codeforces Round 8 E - Zbazi in Zeydabad

http://codeforces.com/contest/628/problem/E L[i][j]  表示(i,j)左边连续的‘z’个数 R[i][j] 表示右边 D[i][j] 从...
  • Techmonster
  • Techmonster
  • 2016年04月01日 13:26
  • 254

Educational Codeforces Round 36

比赛链接 小号打了一场E round,被连hack两道= = A. Garden 题意: 给n个数和一个m,问n个数中能整除m的并且商最小的那个商是多少。 做法: 傻逼题。 ...
  • bestFy
  • bestFy
  • 2018年01月16日 12:45
  • 81

Educational Codeforces Round 8 E. Zbazi in Zeydabad(BIT)

题意: 求n∗m,n,m≤2000的字符串矩阵里,z有几个,单个z也算求n*m, n,m\le2000的字符串矩阵里, z有几个, 单个z也算 ‘z′字形:一个正方形中,第一行和最后一行以及...
  • lwt36
  • lwt36
  • 2016年02月22日 22:21
  • 250

Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components?(连通分量的个数,STL)

描述 You are given an undirected graph consisting of n vertices and edges. Instead of giving y...
  • riba2534
  • riba2534
  • 2018年02月03日 11:14
  • 113

Educational Codeforces Round 27

A 题意:把2 * n个人分成两组,使得无论两组的人怎么进行比赛 第一组的人始终都要保持全赢,如果两个人能力值相等两人都可以赢 思路:排序后只要保证n + 1个人的能力值大于第n个人的能力值即可 #i...
  • sasuke__
  • sasuke__
  • 2017年08月23日 10:35
  • 198

Educational Codeforces Round 34 (Rated for Div. 2) E. Swapping Characters(暴力)

题目链接:http://codeforces.com/contest/903/problem/E 被这个题关了一天啊? 明显是个爆爆爆,因为最多允许有四个不同的位置,我们就暴力枚举交换就好...
  • sinat_32872703
  • sinat_32872703
  • 2017年12月14日 21:35
  • 169

Educational Codeforces Round 8 总结

A. Tennis Tournament time limit per test 1 second memory limit per test 256 megabytes ...
  • zyx520ytt
  • zyx520ytt
  • 2016年02月21日 02:47
  • 589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Educational Codeforces Round 8(E. Zbazi in Zeydabad(树状数组优化))★ ★
举报原因:
原因补充:

(最多只允许输入30个字)