题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2727

题意:

思路:思路来自这里。首先对于每个位置(i,j)用C[i][j]表示该位置同时向左右能延伸的最大长度,用down[i][j]表示向下能延伸的最大长度(其实这里可以用一维的)。然后就是统计。我们一列一列枚举。对于每一列,一行一行来。每次到达一行,(i,k),若C[i][k]>0就可以统计答案了。若该行的上面有一行j(当然j<i-1了),C[j][k]>0,那么就要增加答案了。设k列最上的1的行为top。可知:

我们不管dowm[i][j]的话,可以得到三个参数:

因此我们只要开三个树状数组维护上面三个值就可以了。

i64 S1[N],S2[N],S3[N];
int d[N],n,m,K,L[N],R[N],C[N],down[N];

void up(i64 &x,i64 y)
{
    x=(x+y)%mod;
}

void add(i64 S[],int p,i64 x)
{
    while(p<=m) S[p]=(S[p]+x)%mod,p+=p&-p;
}

i64 get(i64 S[],int p)
{
    i64 ans=0;
    while(p>0) up(ans,S[p]),p-=p&-p;
    return ans;
}

int ID(int i,int j)
{
    return (i-1)*m+j;
}

void init()
{
    int i,j;
    FOR1(i,n)
    {
        L[ID(i,1)]=d[ID(i,1)]?-1:0;
        R[ID(i,m)]=d[ID(i,m)]?-1:0;
        for(j=2;j<=m;j++)
        {
            if(d[ID(i,j)]) L[ID(i,j)]=-1;
            else L[ID(i,j)]=L[ID(i,j-1)]+1;
        }
        for(j=m-1;j>=1;j--)
        {
            if(d[ID(i,j)]) R[ID(i,j)]=-1;
            else R[ID(i,j)]=R[ID(i,j+1)]+1;
        }
        FOR1(j,m) C[ID(i,j)]=min(L[ID(i,j)],R[ID(i,j)]);
    }
    FOR1(j,m) 
    {
        down[ID(n,j)]=d[ID(n,j)]?-1:0;
        for(i=n-1;i>=1;i--) 
        {
            if(d[ID(i,j)]) down[ID(i,j)]=-1;
            else down[ID(i,j)]=down[ID(i+1,j)]+1;
        }
    }
}

int top,pre;

void clear()
{
    top=pre=0;
    int i;
    for(i=0;i<=m;i++) S1[i]=S2[i]=S3[i]=0;
}

i64 ans;

void update(i64 x,int i,int j)
{
    i64 temp=get(S1,x)*x%mod-get(S2,x);
    temp+=x*(x-1)/2%mod*(get(S3,m)-get(S3,x))%mod;
    temp%=mod;
    ans=(ans+temp*down[ID(i,j)])%mod;
}

i64 S(i64 x) {return x*(x+1)/2%mod;}

void deal()
{
    int i,j,k,x;
    for(j=2;j<m;j++)
    {
        clear();
        for(i=1;i<n;i++)
        {
            if(d[ID(i,j)]) clear();
            else if(top==0) top=i;
            else 
            {
                if(C[ID(i,j)]>0) update(C[ID(i,j)],i,j);
                if(pre) 
                {
                    x=C[ID(i-1,j)];
                    add(S1,x,x*(i-1-top)%mod);
                    add(S2,x,S(x)*(i-1-top)%mod);
                    add(S3,x,i-1-top);
                    pre=0;
                }
                if(C[ID(i,j)]) pre=i;
            }
        }
    }
    PR(ans);
}

int main()
{
    RD(n,m,K);
    int i,x,y;
    FOR1(i,K) RD(x,y),d[ID(x,y)]=1;
    init();
    deal();
}

BZOJ 2727 双十字(树状数组)的更多相关文章

  1. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  2. bzoj 1878 SDOI2009树状数组 离线操作

    本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...

  3. bzoj 4785: [Zjoi2017]树状数组【树套树】

    参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...

  4. BZOJ 3262(Treap+树状数组)

    题面 传送门 分析 分三维考虑 对第一维,直接排序 对第二维和第三维,我们这样考虑 朴素的方法是建k棵Treap,第i棵Treap里存第二维值为k的第三维数值 每次查询一组(a,b,c),只要在1~b ...

  5. BZOJ 4765(分块+树状数组)

    题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...

  6. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  7. BZOJ 4999 LCA树状数组差分维护DFS序

    Description 给一颗树,每个节点有个初始值 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x 2. Q i j x(0<=x<2 ...

  8. 【BZOJ2727】双十字(动态规划,树状数组)

    [BZOJ2727]双十字(动态规划,树状数组) 题面 BZOJ 洛谷 题解 我们去年暑假的时候考试考过. 我当时写了个大暴力混了\(70\)分.... 大暴力是这么写的: 预处理每个位置向左右/上/ ...

  9. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

随机推荐

  1. 【BZOJ】【1640】【USACO2007 Nov】/【1692】【USACO2007 Dec】队列变换

    后缀数组/贪心 每次从等待序列的头或尾拿出一个放到答案序列的末尾,那么每次贪心比较头和尾的字典序大小即可…… TAT贪心很好想,但是我一开始没想到是可以直接比较字符串大小……而是一位一位判的,WA了… ...

  2. Basic knowledge of html (keep for myself)

    1. 通常标签 <strong> 替换加粗标签 <b> 来使用, <em> 替换 <i>标签使用. 2. 在 <head>元素中你可以插入脚 ...

  3. Leetcode#56 Merge Intervals

    原题地址 排序+合并,没啥好说的 第一次尝试C++的lambda表达式,有种写js的感觉,很神奇 c11就支持了lambda表达式,仔细想想,我学C++大概就是在09~10年,c11还没有发布,不得不 ...

  4. 手写PE文件(二)

    [文章标题]: 纯手工编写的PE可执行程序 [文章作者]: Kinney [作者邮箱]: mohen_ng@sina.cn [下载地址]: 自己搜索下载 [使用工具]: C32 [操作平台]: win ...

  5. Access数据库和SQL Server数据库在实际应用中的区别

    1.在Access数据库中简历查询语句的步骤 --> 打开你的MDB --> 在数据库窗口中,点击“查询”,或在“视图”菜单中选择“数据库对象”-> “查询” --> 点击数据 ...

  6. Docker 面临的安全隐患,我们该如何应对

    [编者按]对比虚拟机,Docker 在体量等方面拥有显著的优势.然而,当 DevOps 享受 Docker 带来扩展性.资源利用率和弹性提升的同时,其所面临的安全隐患同样值得重视,近日 Chris T ...

  7. codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)

    题目 给出一个n*m的01矩阵, 让你最多改变k个里面的值(0变1,1变0), 使得0.1的连通分量是矩阵.输出最少步数 1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10 题解: 如果01连通分量 ...

  8. Light OJ 1364 Expected Cards (期望dp,好题)

    题目自己看吧,不想赘述. 参考链接:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/02/2842389.html #include &l ...

  9. POJ 3335 Rotating Scoreboard(半平面交求多边形核)

    题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...

  10. Struts2 Convention插件的使用(4)使用@Action注解返回json数据

    package com.hyy.action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.co ...