bzoj

luogu

sol

先预处理从每个点出发向上/下/左/右能延伸多长。

考虑怎么计算答案。我们只要枚举中轴线,再枚举上方的十字交点,枚举下方的十字交点,然后算答案即可。

考虑一个左右宽的最小值为\(L\)的水平线段对下方的影响。对于下方宽度\(\in[2,L]\)的线段,相当于加上一个等差数列,而对于宽度\(>L\)的线段,相当于加上一个定值\(L-1\)。

所以我们现在要做的就是:动态支持区间加等差数列,区间求和。

用树状数组维护的话就需要维护二阶差分。设需要维护的数列是\(a_i\),他的一阶差分是\(b_i\),树状数组维护的二阶差分是\(c_i\),有:

\[\sum_{i=1}^xa_i=\sum_{i=1}^{x}\sum_{j=1}^ib_j\\=\sum_{j=1}^x(x-j+1)b_j\\=\sum_{j=1}^x(x-j+1)\sum_{k=1}^jc_k\\=\sum_{k=1}^xc_k\sum_{j=k}^x(x-j+1)\\=\sum_{k=1}^xc_k\frac 12(x-k+2)(x-k+1)\\=\frac 12[\sum_{k=1}^xc_kk^2-(2x+3)\sum_{k=1}^xc_kk+(x^2-3x+2)\sum_{k=1}^xc_k]
\]

所以开三个树状数组维护\(\sum_kc_k,\sum_kc_kk,\sum_kc_kk^2\)的前缀和即可。

复杂度\(O(RC\log n)\),由于暴力清空了树状数组所以复杂度貌似还要带个\(O(Cn)\)。

当然你要是精细一点的清空是可以做到把这个复杂度去掉的,只是写起来就麻烦一点。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 2e6+5;
const int mod = 1e9+9;
const int inv2 = 5e8+5;
int n,m,k,vis[N],u[N],d[N],l[N],r[N],h[N],c1[N],c2[N],c3[N],ans;
inline int p(int x,int y){if(!x||!y||x>n||y>m)return 0;return (x-1)*m+y;}
inline void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
void init(){for (int i=1;i<=m;++i) c1[i]=c2[i]=c3[i]=0;}
void modify(int x,int v){
for (int i=x;i<=m;i+=i&-i){
add(c1[i],v);
add(c2[i],1ll*x*v%mod);
add(c3[i],1ll*x*x%mod*v%mod);
}
}
int query(int x){
int s1=0,s2=0,s3=0,res=0;
for (int i=x;i;i-=i&-i)
add(s1,c1[i]),add(s2,c2[i]),add(s3,c3[i]);
add(res,1ll*(1ll*x*x+3*x+2)%mod*s1%mod);
add(res,mod-1ll*(x+x+3)*s2%mod);add(res,s3);
res=1ll*res*inv2%mod;return res;
}
int main(){
n=gi();m=gi();k=gi();
for (int i=1,x,y;i<=k;++i) x=gi(),y=gi(),vis[p(x,y)]=1;
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
if (!vis[p(i,j)]) u[p(i,j)]=u[p(i-1,j)]+1,l[p(i,j)]=l[p(i,j-1)]+1;
for (int i=n;i;--i)
for (int j=m;j;--j)
if (!vis[p(i,j)]) d[p(i,j)]=d[p(i+1,j)]+1,r[p(i,j)]=r[p(i,j+1)]+1;
for (int i=1,id;i<=n;++i)
for (int j=1;j<=m;++j)
if (!vis[p(i,j)]){
id=p(i,j);
h[id]=min(l[id],r[id])-1;
--d[id];--u[id];
}
for (int j=2;j<m;++j,init())
for (int i=3;i<n;++i){
int id=p(i,j);
if (vis[id]) {init();continue;}
if (h[id]) add(ans,1ll*query(h[id]-1)*d[id]%mod);
modify(1,u[id-m]);modify(h[id-m]+1,mod-u[id-m]);
}
printf("%d\n",ans);return 0;
}

[BZOJ2727][HNOI2012]双十字的更多相关文章

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

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

  2. bzoj 2727: [HNOI2012]双十字

    Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...

  3. [HNOI2012]双十字

    题目描述 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的”1“线段组成,要求满足以下几个限制: ![] 我们可以找到 5 个满足条件的双十字,分别如下 ...

  4. # HNOI2012 ~ HNOI2018 题解

    HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...

  5. #YCB#待做题目与填坑资料

    各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. bzoj 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...

  8. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  9. bzoj 2734: [HNOI2012]集合选数 状压DP

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status ...

随机推荐

  1. java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别

    在平常工作中使用到char和byte的场景不多,但是如果项目中使用到IO流操作时,则必定会涉及到这两个类型,下面让我们一起来回顾一下这两个类型吧. char和byte的对比 byte byte 字节, ...

  2. 32Sql数据库的插入

    上一节讲了数据库的连接,本例直接将数据库的插入操作,重点还是QSqlQuery类 QSqlQuery query; //新建二维表 query.exec("CREATE TABLE stud ...

  3. 大数据领域两大最主流集群管理工具Ambari和Cloudera Manger

    不多说,直接上干货! 目前啊,都知道,大数据集群管理方式分为手工方式(Apache hadoop)和工具方式(Ambari + hdp 和Cloudera Manger + CDH).  手工部署呢, ...

  4. Python笔记 #04# Methods

    源:DataCamp datacamp 的 DAILY PRACTICE  + 日常收集. Methods String Methods List Methods 缺一 Methods You can ...

  5. Win7系统(台式机)设置系统的窗口背景色(豆沙绿色)

    Win7系统(台式机)设置系统的窗口背景色(豆沙绿色) 1,桌面->右键->个性化->窗口颜色->高级外观设置->项目选择(窗口).颜色1(L)选择(其它)将色调改为:8 ...

  6. 20155201 实验二《Java面向对象程序设计》实验报告

    20155201 实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. ...

  7. ZLYD团队第三周项目总结

    ZLYD团队第三周项目总结 项目进展 我们的吃豆子游戏的程序由八个文件组成:Wall.java.Gold.java.Player.java.Fruit.java.Enemy.java.Ticker.j ...

  8. kotlin 学习感受

    目录 kotlin 学习感受 特点 优点 屎一样的缺点 总结 kotlin 学习感受 直白的说..很不好,像屎一样,本来对此抱有很大的期望和好感度,但经过一整天的学习,完全失望了,这门语言中间有各种的 ...

  9. postgresql常用操作

    需要安装的软件包: apt-get install postgresql postgresql-client-9.1 postgresql-common postgresql-9.1 postgres ...

  10. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations 矩阵快速幂优化dp

    D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes inpu ...