博客
关于我
HDU - 6514 Monitor(二维差分+二维前缀和)
阅读量:318 次
发布时间:2019-03-04

本文共 2510 字,大约阅读时间需要 8 分钟。


题目大意

给出一个 n ∗ m n*m nm的麦田(左下角为 ( 1 , 1 ) , (1,1), (1,1)右上角 ( n , m ) (n,m) (n,m)),其中有 p p p个矩形区域安装了监控,接下来有 q q q个贼想偷某个矩形范围内的庄稼,问监控能否拍到贼。

解题思路

这时一道考验二维差分+二维前缀和的一道非常好的题目。

首先我们需要将有监控的区域都置为 1 1 1,也就是每个监控区域的所有元素都加一,这时不难想到二维差分,有的元素可能被多个监控重复覆盖,那么差分矩阵还原时需要将大于 1 1 1的元素置为 1 1 1。然后对还原的矩阵求前缀和,只需要看贼偷东西的矩阵的元素和是否为矩阵面积。

题目有两大坑点:

  • 题目给的坐标是左下角为 ( 1 , 1 ) , (1,1), (1,1)右上角 ( n , m ) (n,m) (n,m)的矩阵,但是计算机存储的矩阵是左上角为 ( 1 , 1 ) , (1,1), (1,1)右下角 ( n , m ) (n,m) (n,m)。要么坐标转化一下,要么将矩阵颠倒一下。

  • 矩阵的范围是 n ∗ m ≤ 1 e 7 n*m \leq 1e7 nm1e7,无法通过数组存,要么使用 v e c t o r vector vector v e c t o r vector vector,要么就使用一维数组模拟二维数组,将下标转化一下。

一开始写了好久的一维数组一直挂,不知道哪里错了改了二维动态数组就过了,离谱

//// Created by Happig on 2020/10/29//#include 
#include
#include
using namespace std;#define fi first#define se second#define pb push_back#define ins insert#define Vector Point#define ENDL "\n"#define lowbit(x) (x&(-x))#define mkp(x, y) make_pair(x,y)#define mem(a, x) memset(a,x,sizeof a);typedef long long ll;typedef long double ld;typedef unsigned long long ull;typedef pair
pii;typedef pair
pll;typedef pair
pdd;const double eps = 1e-8;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;const double dinf = 1e300;const ll INF = 1e18;const int Mod = 1e9 + 7;const int maxn = 1e7 + 10;void add(vector
> &d, int i, int j, int x, int y, int val) { d[i][j] += val, d[x + 1][y + 1] += val; d[i][y + 1] -= val, d[x + 1][j] -= val;}int getSum(vector
> &d, int i, int j, int x, int y) { return d[x][y] - d[i - 1][y] - d[x][j - 1] + d[i - 1][j - 1];}int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, m, p, q; int lx, ly, rx, ry; while (cin >> n >> m) { vector
> d(n + 2, vector
(m + 2)); cin >> p; while (p--) { cin >> lx >> ly >> rx >> ry; lx = n + 1 - lx, rx = n + 1 - rx; swap(lx, rx); add(d, lx, ly, rx, ry, 1); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { d[i][j] = d[i][j] + d[i - 1][j] + d[i][j - 1] - d[i - 1][j - 1]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (d[i][j]) d[i][j] = 1; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { d[i][j] = d[i][j] + d[i - 1][j] + d[i][j - 1] - d[i - 1][j - 1]; } } cin >> q; while (q--) { cin >> lx >> ly >> rx >> ry; lx = n + 1 - lx, rx = n + 1 - rx; swap(lx, rx); int ans = getSum(d, lx, ly, rx, ry); if (ans == (rx - lx + 1) * (ry - ly + 1)) cout << "YES" << endl; else cout << "NO" << endl; } } return 0;}

转载地址:http://viqq.baihongyu.com/

你可能感兴趣的文章
使用命令把SpringBoot项目打包成可运行的jar包(简洁,操作性强)
查看>>
List数组排序
查看>>
VMware vSphere 离线虚拟机安装 BIND 9
查看>>
dojo/request模块整体架构解析
查看>>
Javascript定时器学习笔记
查看>>
dojo的发展历史
查看>>
Python存储系统(Redis)
查看>>
C语言指针收藏
查看>>
C#搞个跨平台的桌面NES游戏模拟器
查看>>
手把手教你安装Eclipse最新版本的详细教程 (非常详细,非常实用)
查看>>
《带你装B,带你飞》pytest成魔之路4 - fixture 之大解剖
查看>>
互联网App应用程序测试流程及测试总结
查看>>
根据轨迹分析出用户家在哪
查看>>
PostgreSQL查询表名称及表结构
查看>>
linux中使用awk命令
查看>>
如何使用google搜索?
查看>>
Redis分布式锁的正确实现方式
查看>>
设计模式-抽象工厂模式
查看>>
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
查看>>
IDEA 调试Java代码的两个技巧
查看>>