分析

观察到是曼哈顿距离 \(\le r\) 的范围可以扫到,联想到如下图形:

左边是 \(r=1\) 可以扫到的范围,右边是 \(r=2\) 可以扫到的范围。

于是,我们只要对这样的图形在 \(1000*1000\) 的格子里差分一下就好了 。

但这样的复杂度是 \(O(nm)\) 的,会死的很惨。

优化

不难发现这个图形是一个旋转过 \(45°\) 的正方形,所以我们先把他转回来。

归纳法可以得到原先为 \((x,y)\) 的点会变换为 \((n+x-y,x+y-1)\) 。

严格证明有点忘了,记得好像是用一次函数或者几何全等一线三等角证的。

于是我们就把一个斜着的图形变正了。

接下来就是把这个正方形的四个顶点算出来并且变换一下,套一个二维差分的板子,很简单。

时间为 \(O(m)\) ,常数有点大。

另外,为了不特判边界情况,可以直接开 \(4000*4000\) 的数组,把变换后的点横纵坐标都加一个 \(1000\) ,就不用处理下标为负数的情况。出题人比较好心,给了 \(2000ms\) 和 \(1024Mib\) 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
int n,m,f[5005][5005],q;
pi change(pi ori)
{
int x=ori.first,y=ori.second;
return {n+x-y+1100,x+y-1+1100};
}
bool check(pi t)
{
int x=t.first,y=t.second;
return (x>=1&&x<=2*n-1&&y>=1&&y<=2*n-1);
}
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
while(m--)
{
int x,y,r;
cin>>x>>y>>r;
pi zs=change({x-r,y});
pi zx=change({x,y-r});
pi ys=change({x,y+r});
pi yx=change({x+r,y});
f[zs.first][zs.second]++;
f[zx.first+1][zx.second]--;
f[ys.first][ys.second+1]--;
f[yx.first+1][yx.second+1]++;
}
for(int i=1;i<=5000;i++)
{
for(int j=1;j<=5000;j++)
{
f[i][j]=f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1];
}
}
cin>>q;
while(q--)
{
int x,y;
cin>>x>>y;
pi now=change({x,y});
cout<<f[now.first][now.second]<<endl;
}
return 0;
}

HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]的更多相关文章

  1. 洛谷 P3397 地毯 【二维差分标记】

    题目背景 此题约为NOIP提高组Day2T1难度. 题目描述 在n*n的格子上有m个地毯. 给出这些地毯的信息,问每个点被多少个地毯覆盖. 输入输出格式 输入格式: 第一行,两个正整数n.m.意义如题 ...

  2. Gym 102028J 扫描线/二维差分 + 解方程

    题意:有一个二维平面,以及n个操作,每个操作会选择一个矩形,使得这个二维平面的一部分被覆盖.现在你可以取消其中的2个操作,问最少有多少块地方会被覆盖? 思路:官方题解简洁明了,就不细说了:https: ...

  3. Codeforces Round #578 (Div. 2) 二维差分 可做模板

    题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对 ...

  4. 2020ICPC&#183;小米 网络选拔赛第一场 J.Matrix Subtraction (贪心,二维差分)

    题意:给一个\(nXm\)的矩阵,可以选取\(aXb\)的子矩阵,使子矩阵中的所有元素减一,问最后是否能使矩阵中所有元素变为\(0\). 题解:首先贪心,我们看最左上角的元素,如果\(g[1][1]\ ...

  5. HDU - 6514 Monitor(二维差分)

    题意 给定一个\(n×m\)的矩阵.(\(n×m <= 1e7\)). \(p\)次操作,每次可以在这个矩阵中覆盖一个矩形. \(q\)次询问,每次问一个矩形区域中,是否所有的点都被覆盖. 解析 ...

  6. NOI 2012 魔幻棋盘 | 二维差分 + 二维线段树

    题目:luogu 2086 二维线段树,按套路差分原矩阵,gcd( x1, x2, ……, xn ) = gcd( xi , x2 - x1 , ……, xn - xn-1 ),必须要有一个原数 xi ...

  7. Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)

     题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ...

  8. Monitor HDU6514 二维差分入门学习

    Monitor HDU 6514 二维差分入门学习 题意 小腾有\(n*m\)的田地,但是有小偷来偷东西,在一片矩形区域上,有一部分区域是监控可以覆盖到的,这部分区域由一个或多个包含于该矩形区域的小矩 ...

  9. 220514 T2 画画 (二维差分)

    首先我们需要特判只涂了一种颜色的情况: (1)k=1,此时答案就是1:(2)k>1,涂的这种颜色肯定不能是第一个,答案是k-1; 对于其他正常情况,我们对于每个颜色找到一个最小的矩形(这个矩形内 ...

  10. [luogu] P4514 上帝造题的七分钟 (树状数组,二维差分)

    P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a ...

随机推荐

  1. uniapp select组件

    1.前言 官方的picker组件不能禁用某个下拉项,所以就有了这个下拉组件 组件只适配了宽屏模式,效果参照element-ui的select组件 demo地址:lianlizhou / ep-sele ...

  2. base64计算文件大小方法(C#和js)

    base64文件大小计算 有时候图片被base64之后需要计算图片大小,因为被编码后全是字符,计算文件大小可以反序列化成文件之后再获取大小,但是会比较麻烦.简单介绍一种利用base64编码原理计算大小 ...

  3. vue前端代码npm install报错的解决方法

    npm install,报错: npm WARN tarball tarball data for has-bigints@https://registry.npmmirror.com/has-big ...

  4. ECShop开源商城与COS互通:降低本地存储负载、提升访问体验

    ECShop简介 ECShop是一款开源电子商务平台,具有简单易用.安全稳定.模块化设计等特点.它提供了完整的电子商务解决方案,包括商品管理.订单管理.支付管理.配送管理.会员管理.促销管理.数据统计 ...

  5. The Financial-Grade Digital Infrastructure

    ​ ​ 01 Product Introduction   The Financial-Grade Digital Infrastructure is a digitally-enabled foun ...

  6. 中电金信:数字经济时代,AI+金融技术应用与未来发展

  7. Centos yum命令提示failed to set locale, defaulting to C

    目录 问题 locale提示 解决方案 问题 在输入yum命令是出现 Failed to set locale, defaulting to C 1 出现这个问题是由于系统没有正确设置locale环境 ...

  8. Qt编写的项目作品17-自定义曲线图柱状图

    一.功能特点 可设置X轴Y轴范围值. 可设置背景颜色.文本颜色.网格颜色. 可设置三条曲线颜色.颜色集合. 可设置是否显示十字定位线,支持分别开启横向或者纵向定位线. 可设置十字定位线的宽度.颜色. ...

  9. Qt编写地图综合应用8-地图交互

    一.前言 最常用的地图交互就几个,比如鼠标在地图上按下的时候可以拾取经纬度坐标,然后传给Qt程序,再比如对设置的设备点进行单击的时候,通知Qt程序单击了哪一个设备点,好让Qt程序识别并作出反应比如弹出 ...

  10. 在C#中如何设置DateTimePicker控件显示“年-月-日 时:分:秒”的格式

    在C#中DateTimePicker控件默认显示的日期格式为"年-月-日",并未显示"时:分:秒",如何设置DateTimePicker控件显示"年- ...