题意简述

  • 给定一张 $H \times W $ 的网格图,其中有 \(P\) 个被标记的点,求边长为 \(L\) 或以上的正方形的个数,要求正方形的边不得经过被标记的点。

  • \(1 \le H,W \le 4000\), \(1 \le P \le 10^5\)

分析与解答

考虑枚举合法正方形的左下端点 \((i,j)\) 和正方形边长 \(len\) ,由此可以得到右上端点 \((i+len-1,j+len-1)\)。

考虑什么条件下枚举到的正方形才能被计入答案。

记 \(left,right,up,down\) 数组,分别表示点 \((i,j)\) 向左/右/上/下最多能延伸多少长度,并且不遇到被标记的点。

\(left,right,up,down\) 数组可以通过 \(\Theta(nm)\) 递推得到。

记 \(lu_{i,j}=\min(light_{i,j},up_{i,j})\), \(rd_{i,j}=\min(right_{i,j},down_{i,j})\)

\(x = i+len-1\),\(y=j+len-1\)

那么必须当 \(lu_{i,j} \ge len\) 且 \(rd_{x,y} \ge len\) 且 \(len \ge L\) 时,这个正方形才能被计入答案。

也就是说对于 \((i,j)\),我们需要求出有多少个点 \(i+len-1\), \(j+len-1\) 满足 \(rd_{i+len-1,j+len-1} \ge len\)。

这个问题就可以用主席树解决。

时间复杂度 \(\Theta(nm \log_2 (\max(n,m)))\)

Code

#include <cstdio>
#include <iostream>
#include <cstring> using namespace std; typedef long long ll;
const int MAXN = 4010; int n, m, l, k, a[MAXN][MAXN];
int ld[MAXN][MAXN], rd[MAXN][MAXN], ud[MAXN][MAXN], dd[MAXN][MAXN]; struct node{
int lc, rc, val;
}t[MAXN*40];
int rt[MAXN], cnt = 0;
void update(int l, int r, int &now, int ver, int pos)
{
t[now = ++cnt] = t[ver];
++t[now].val;
if(l == r) return ;
int mid = l+r>>1;
if(pos <= mid) update(l, mid, t[now].lc, t[ver].lc, pos);
else update(mid+1, r, t[now].rc, t[ver].rc, pos);
}
int query(int l, int r, int x, int y, int ql, int qr)
{
if(l >= ql && r <= qr) return t[y].val - t[x].val;
int mid = l+r>>1;
int res = 0;
if(ql <= mid) res += query(l, mid, t[x].lc, t[y].lc, ql, qr);
if(qr >= mid+1) res += query(mid+1, r, t[x].rc, t[y].rc, ql, qr);
return res;
} int d1[MAXN], d2[MAXN], tot; inline int calc()
{
const int maxn = max(n, m);
cnt = 0;
for(int i=1;i<=tot;i++)
update(-maxn, maxn, rt[i], rt[i-1], d2[i]-i-1);
int res = 0;
for(int i=1;i<=tot;i++)
{
int nl = i+l-1, nr = i+d1[i]-1;
if(nl > nr) continue;
res += query(-maxn, maxn, rt[nl-1], rt[nr], -i, maxn);
}
return res;
} int main()
{
scanf("%d%d%d%d",&n,&m,&l,&k);
for(int i=1;i<=k;i++)
{
int x, y;
scanf("%d%d",&x,&y);
a[x][y] = 1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
ld[i][j] = a[i][j]?0:ld[i][j-1]+1;
ud[i][j] = a[i][j]?0:ud[i-1][j]+1;
}
for(int i=n;i>=1;i--)
for(int j=m;j>=1;j--)
{
rd[i][j] = a[i][j]?0:rd[i][j+1]+1;
dd[i][j] = a[i][j]?0:dd[i+1][j]+1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j] = 0;
ll ans = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]) continue;
int x = i, y = j;
tot = 0;
while(x <= n && y <= m)
{
a[x][y] = 1;
d1[++tot] = min(rd[x][y], dd[x][y]);
d2[tot] = min(ld[x][y], ud[x][y]);
++x, ++y;
}
ans += calc();
}
printf("%lld\n",ans);
return 0;
}

城壁 (Rampart)的更多相关文章

  1. 超时空英雄传说2复仇魔神完全攻略&秘技

    ╓─╥───────────────────────────────────────────────────╥─╖ ║ ║ 超 時 空 英 雄 傳 說 2 ║ ║ ║ ║ --復 仇 魔 神-- ║ ...

  2. 城市区号SQL

    今天写代码的时候需要用到全国城市区号,网上找了好久没有现成的SQL,于是自己录数据写了一个,和大家共享! 目前还只有300个城市的区号 文件下载地址放在最后! GO FROM sysobjects W ...

  3. 路飞学城Python-Day59(第五模块复习题)

    HTML div标签是块级标签,单独一行,可以作为其他标签的容器,没有特定含义 span是内联标签,可以作为文本内容的容器,没有特定含义 1. 查询一下对div和span标签的理解 不同的标签有自己含 ...

  4. Y+的查看及FLUENT壁面函数的选择

    y+的查看 其实,我们关心的应该是壁面y+值.那么我们看云图的话,是可以直接看到的,但是个人感觉,如果case大的话,也不是很方便.此外,你要是看云图的话,要用filled的方式,而且把node va ...

  5. 微软Dynamics 使用葡萄城的Wijmo 5提供移动端用户界面选择

    近日,全球最大的控件提供商葡萄城公司宣布: 葡萄城近日与微软公司达成合作,将Wijmo 产品线的HTML5和JaveScript 控件融合到微软Dynamics CRMOnline 2016版中. 随 ...

  6. 2015Web前端攻城之路

    2015目标成为一名合格的前端攻城狮. 养成计划: 1.html / css 2.js 3.ajax 4.框架 5.项目实战

  7. 微软Dynamics 使用葡萄城的Wijmo 5提供移动端用户界面

    近日,全球最大的控件提供商葡萄城公司宣布: 葡萄城近日与微软公司达成合作,将Wijmo 产品线的HTML5和JaveScript 控件融合到微软Dynamics CRMOnline 2016版中. 随 ...

  8. 引水入城(codevs 1066)

    题目描述 Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政 区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 市,每座 ...

  9. 安全攻城狮研发技能栈V1.0,附详细点评~

    2015-12-21 正宗好PT 正宗好PT 今天公司年会,又木有抽到奖,求安慰/(ㄒoㄒ)/~~ 言归正传,我曾经在推特发过一个Skill CheatSheet,被转发和点赞了几百次,我又更新了一下 ...

  10. 【NOIP2010】引水入城

    以前一直以为是什么高端DP,看了题解才发现是水题,老是这样看题解才能写出来到赛场上怎么办嘛QAQ 原题: 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好 ...

随机推荐

  1. vue移动端禁止弹层穿透、点击元素滚动到视图中心杂文日志

    一,需求是在无限列card加载页面,点击任何一个card的显示图表按钮,图表自适应居中显示,显示遮罩层,页面可以滑动,但不能穿透点击 一个无限列表加载页面设置遮罩层一般需求是页面不能滑动的,但这比较特 ...

  2. 面向对象基础之基础—控制台C#模拟银行ATM存取操作实例

    c#控制台应用程序ATM银行操作实例.主要介绍了设计的方法:使用的类介绍:具体的运行界面:程序代码.代码直接写在一起放在Programm.cs中,拷贝可直接运行. 一.设计 1.原则上采用三层:(1) ...

  3. vue样式穿透 滚动条隐藏 原生样式修改

    样式穿透:deep,否则可能不能覆盖原有样式,vue2使用/v-deep/或者::v-deep,或者取消scoped,但不推荐,因为会影响到其他页面样式 <style lang="sc ...

  4. 阶梯场景jp@gc - Stepping Thread Group (deprecated)

    1.新建线程,添加配置元件.监听器 由上可见: 需要启动100个线程, 然后间隔30s就持续5s去启动10个线程, 那么就需要这样重复操作10次,才能100个线程全部启动. 最后整体100个线程持续运 ...

  5. 关于java业务限流组件的应用推广

    可参考的链接如下: 限流算法对比.网关限流实践总结(https://segmentfault.com/a/1190000020745218) 高并发下常见的限流算法(https://www.jians ...

  6. libvirtd升级

    如果对图形化界面没有诉求,能够使用命令行进行虚拟化相关操作,建议使用系统自 带的libvirt-4.5.0. 由于libvirt-4.5.0代码存在bug,所以在使用virt-manager时会触发一 ...

  7. HCIP-ICT实战进阶07-BGP路由选路

    HCIP-ICT实战进阶07-BGP路由选路 1 BGP路径属性 任何一条BGP路由拥有多个路径属性; 当路由器将BGP路由拥有通告他的对等体时, 在Update报文中一并被通告的还有路由所携带的各个 ...

  8. spring@Validated校验用法

    1.controller添加注解 public BaseResponse addOrUpdateUnit(@RequestBody @Validated RiskUnitDto riskUnitDto ...

  9. 求助:我需要用Python中parsel模块提取文章的文本内容,有什么办法

    求助: 像这样 我想提取小说文章内容 怎么提取 我要用的模块有parsel <!DOCTYPE html> <html lang="en"> <hea ...

  10. ES-增删改查

    写作目的 供想了解ES数据操作的伙伴学习ES的CRUD操作. 测试环境 ES7.8.1 postman 创建索引库 // PUT请求 localhost:9200/test_alert { " ...