BZOJ 2727 双十字(树状数组)
题目链接: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 双十字(树状数组)的更多相关文章
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- bzoj 1878 SDOI2009树状数组 离线操作
本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...
- bzoj 4785: [Zjoi2017]树状数组【树套树】
参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...
- BZOJ 3262(Treap+树状数组)
题面 传送门 分析 分三维考虑 对第一维,直接排序 对第二维和第三维,我们这样考虑 朴素的方法是建k棵Treap,第i棵Treap里存第二维值为k的第三维数值 每次查询一组(a,b,c),只要在1~b ...
- BZOJ 4765(分块+树状数组)
题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...
- BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...
- BZOJ 4999 LCA树状数组差分维护DFS序
Description 给一颗树,每个节点有个初始值 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x 2. Q i j x(0<=x<2 ...
- 【BZOJ2727】双十字(动态规划,树状数组)
[BZOJ2727]双十字(动态规划,树状数组) 题面 BZOJ 洛谷 题解 我们去年暑假的时候考试考过. 我当时写了个大暴力混了\(70\)分.... 大暴力是这么写的: 预处理每个位置向左右/上/ ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
随机推荐
- 【BZOJ】【1041】【HAOI2008】圆周上的点
数学 orz hzwer 完全不会做…… 很纠结啊,如果将来再遇到这种题,还是很难下手啊…… 引用题解: [分析]: 样例图示: 首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检查是否 ...
- centos使用更新更快的yum源
The Remi Repo is a yum repository maintained by a French dude - Remi Collet. It contains much more u ...
- 引擎设计跟踪(九.8) Gizmo helper实现与多国语言
最近把gizmo helper的绘制做好了. 1.为了复用代码,写了utility来创建sphere, cube, cylinder, plane, ring(line), circle(solid) ...
- Codeforces Round #261 (Div. 2)
第一场难得DIV2简单+AK人数多: E:给出一张图,求最多的边数,满足:在这个边的集合中后面的边的权值大于前面的边; 思路:我们将图按权值排列,以为只可能边权值小的跟新权值大的所以对于一条边我们只跟 ...
- linux yum 命令 详解
linux yum命令详解 yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能 ...
- 自定义TexturePacker插件导出自己的plist文件
原地址:http://www.cppblog.com/sunicdavy/archive/2014/02/06/205645.html cocos2dx引擎使用plist文件, 一种特殊的xml格式作 ...
- 结合NGUI做的手机拍照(可自定义相框)
原地址:http://www.unity蛮牛.com/thread-18220-1-1.html 在次此之前我们先要了解一下下面的我要讲的几个内容: 一.为什么要用NGUI,因为NGUI的可以做屏幕自 ...
- Sqli-labs less 28a
Less-28a 本关与28基本一致,只是过滤条件少了几个. http://127.0.0.1/sqllib/Less-28a/?id=100%27)unIon%0bsElect%0b1,@@base ...
- 【译】Python中如何创建mock?
原文地址:http://engineroom.trackmaven.com/blog/making-a-mockery-of-python/ 今天我们来谈论下mock的使用.当然,请不要误会,这里的m ...
- 【Spark】概述
大数据数据处理模型: 1.Google的MapReduce是一个简单通用和自动容错的批处理计算模型.但,不适合交互式和流式计算! 2.Storm 3.Impala 4.GraphLab 5.Spark ...