[BZOJ2727][HNOI2012]双十字
sol
先预处理从每个点出发向上/下/左/右能延伸多长。
考虑怎么计算答案。我们只要枚举中轴线,再枚举上方的十字交点,枚举下方的十字交点,然后算答案即可。
考虑一个左右宽的最小值为\(L\)的水平线段对下方的影响。对于下方宽度\(\in[2,L]\)的线段,相当于加上一个等差数列,而对于宽度\(>L\)的线段,相当于加上一个定值\(L-1\)。
所以我们现在要做的就是:动态支持区间加等差数列,区间求和。
用树状数组维护的话就需要维护二阶差分。设需要维护的数列是\(a_i\),他的一阶差分是\(b_i\),树状数组维护的二阶差分是\(c_i\),有:
\]
所以开三个树状数组维护\(\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]双十字的更多相关文章
- 【BZOJ2727】双十字(动态规划,树状数组)
[BZOJ2727]双十字(动态规划,树状数组) 题面 BZOJ 洛谷 题解 我们去年暑假的时候考试考过. 我当时写了个大暴力混了\(70\)分.... 大暴力是这么写的: 预处理每个位置向左右/上/ ...
- bzoj 2727: [HNOI2012]双十字
Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...
- [HNOI2012]双十字
题目描述 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的”1“线段组成,要求满足以下几个限制: ![] 我们可以找到 5 个满足条件的双十字,分别如下 ...
- # HNOI2012 ~ HNOI2018 题解
HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...
- #YCB#待做题目与填坑资料
各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
随机推荐
- 线程、进程、daemon、GIL锁、线程锁、递归锁、信号量、计时器、事件、队列、多进程
# 本文代码基于Python3 什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...
- c# ArrayList 的排序问题!
2009-01-19 20:10 c# ArrayList 的排序问题! c# ArrayList 的排序问题! 我看见网上有人用IComparer接口实现ArrayLIst 的排序问题 ,于是自己写 ...
- oracle extract 函数简介
oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 //语法如下: EXTRACT ( { YEA ...
- phpstorm 代码片段使用方法
原文链接: http://wwwquan.com/show-66-121-1.html 4.Live Templates代码片断 A)我们先介绍一个代码片段最基本的功能,我们要实现的目标是在html文 ...
- 20145336张子扬 《网络对抗》逆向及bof基础
20145336张子扬 <网络对抗>逆向及bof基础 学习知识点 缓冲区溢出 缓冲区溢出 一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序 ...
- linux内核启动时报错ubi0 error: validate_ec_hdr: bad VID header offset 256, expected 64
1.详细错误报告如下: ubi0 error: validate_ec_hdr: bad VID header offset 256, expected 64 ubi0 error: validate ...
- 利用HTML中map标签实现整张图片带有可点击区域的图像映射:
实现效果说明:一整张背景图片,实现图标区域出现链接,可点击跳转到指定页面. <div class="brand"> <img src="images/b ...
- hdu 4739 Zhuge Liang's Mines DFS
http://acm.hdu.edu.cn/showproblem.php?pid=4739 题意: 给定100*100的矩阵中n(n<= 20)个点,每次只能一走能够形成正方形的四个点,正方形 ...
- SpringBoot创建多模块方式以及打包方式
springboot重构多模块的步骤 模型层:model 持久层:persistence 表示层:web 步骤: 正常创建一个springboot项目 修改创建项目的pom文件,将jar修改为pom ...
- 2243: [SDOI2011]染色 树链剖分+线段树染色
给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ...