题意:在 n×m 的二维图上,有三种操作:
1 r1 c1 r2 c2 表示沿着 (r1, c1, r2, c2) 所表示的矩形的外边框建围墙。(其中 (r1, c1) 为矩形左上角,(r2, c2) 表示矩形右下角)。
2 r1 c1 r2 c2 表示取消 (r1, c1, r2, c2) 所示矩形的围墙。(保证最初图不存在围墙,删除的围墙一定是之前通过操作 1 建立的)。

3 r1 c1 r2 c2 表示询问 (r1, c1) 到 (r2, c2) 是否可以不翻越围墙到达。对于每个操作 3,可以输出 Yes ,否则输出 No 。

(n, m <= 2500, q <= 1e5, 保证围墙没有相交)

思路:因为围墙之间不相交,所以我们可以把每个围墙内部都设置成一个值,询问的时候只要看两个点的值是否相同即可。那么怎么

将一个围墙内设为一个值呢,我们可以利用二维BIT,利用前缀和,进行区间更新,单点查询,跟一维的时候区间更新单点更新一

样。那么删除的时候怎么快速得到这个围墙原来设置的是什么值呢,我们可以用哈希,将四个坐标哈希成一个值,具体见代码。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2505;
const int seed = 2333;
ll tree[maxn][maxn], n, m, q;
int lowbit(int x)
{return  x&(-x);
}void update(int x, int y, ll val)
{for(int i = x; i <= n; i += lowbit(i))for(int j = y; j <= m; j += lowbit(j))tree[i][j] += val;
}void update(int x1, int y1, int x2, int y2, ll val)
{update(x1, y1, val);update(x1, y2+1, -val);update(x2+1, y1, -val);update(x2+1, y2+1, val);
}ll query(int x, int y)
{ll res = 0;for(int i = x; i; i -= lowbit(i))for(int j = y; j; j -= lowbit(j))res += tree[i][j];return res;
}int main(void)
{while(~scanf("%I64d%I64d%I64d", &n, &m, &q)){memset(tree, 0, sizeof(tree));int cmd, x1, y1, x2, y2;while(q--){scanf("%d%d%d%d%d", &cmd, &x1, &y1, &x2, &y2);ll val = x1;val = val*seed+y1;val = val*seed+x2;val = val*seed+y2;if(cmd == 1)update(x1, y1, x2, y2, val);else if(cmd == 2)update(x1, y1, x2, y2, -val);else{ll tmp1 = query(x1, y1);ll tmp2 = query(x2, y2);puts(tmp1 == tmp2 ? "Yes" : "No");}}}return 0;
}

Codeforces Round #439 (Div. 2) E. The Untended Antiquity(二维BIT)相关推荐

  1. Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维线段树||二维树状数组

    http://codeforces.com/contest/869/problem/E 题意:n*m的矩阵,q次操作,三种类型 类型1:给指定矩阵加上围栏 类型2:给指定矩阵去掉围栏 类型3:查询两点 ...

  2. Codeforces Round #439 (Div. 2) E. The Untended Antiquity

    E. The Untended Antiquity Problem Statement Adieu l'ami.     Koyomi is helping Oshino, an acquaintan ...

  3. Codeforces Round #439 (Div. 2) E. The Untended Antiquity (hash+数状数组)

    这个题,做出来的人很多,我感觉是数据不够强,我看了很多人的代码直接暴力也能过了,直接暴力如果数据够强的话肯定是时间超限,边缘数据不够强.如果和上次一样估计很多人的E会GG.我看到一位OIdalao的代 ...

  4. Codeforces Round #601 (Div. 2)D. Feeding Chicken,二维压一维,几何平面的分配

    D. Feeding Chicken 题目大意:就是给你一个r∗cr*cr∗c的矩阵,矩阵上若干个位置上有食物,你有k只小鸡,你要将这r∗cr*cr∗c的矩阵分成k个联通块给每个小鸡,使得有最大食物的 ...

  5. Codeforces 869E. The Untended Antiquity (二维Fenwick,Hash)

    Codeforces 869E. The Untended Antiquity 题意: 在一张mxn的格子纸上,进行q次操作: 1,指定一个矩形将它用栅栏围起来. 2,撤掉一个已有的栅栏. 3,询问指 ...

  6. CodeForces 869E The Untended Antiquity 二维树状数组,随机hash

    CodeForces 869E 题意: n*m 的格子,有三种操作, 1.在一个矩形周围加一层障碍.2.把一个矩形周围的障碍去掉. 3.询问两个格子是否可达.     题目保证不会有矩形障碍交叉,且去 ...

  7. Codeforces Round #439 (Div. 2) Problem C (Codeforces 869C) - 组合数学

    - This is not playing but duty as allies of justice, Nii-chan! - Not allies but justice itself, Onii ...

  8. Codeforces Round #439 (Div. 2)

    一句话题意: A:传送门 题意:给定两个长为\(n\)的数组\(a\),\(b\),令\(ans=\)有序对\((i,j)\)的个数使得\(a_i\ xor\ b_j\)在这\(2n\)个数中出现过, ...

  9. Codeforces Round #439 (Div. 2)C - The Intriguing Obsession(简单dp)

    传送门 题意 给出三个集合,每个集合的元素数量为a,b,c,现在需要连边,满足集合内元素不可达或最短路为3,求可行方案数 分析 设dp[i][j]为a集合元素为i个,b集合元素为j个的可行方案,易知( ...

最新文章

  1. 软件测试工具和报告学习-3月6日
  2. 近世代数--群同构--第二同构定理
  3. shell 调用 sqlplus 各种情况示例
  4. x210 debug口当普通串口使用
  5. 填平数据、产品、模式需求鸿沟,浪潮云发布新一代行业云 MEP战略
  6. Docker容器时间与宿主机同步
  7. Facebook 数据的横向扩展
  8. Struts1 生成Action请求的几种方式分析
  9. pandas去掉html标签,用Pandas清理HTML表
  10. Java多态的理解,真实开发详解,带编程,通俗白话文,简单易懂
  11. Python全栈 Linux基础之2.Linux终端命令简介
  12. Selenium电脑上怎么下载-Selenium下载和安装图文教程[超详细]
  13. Ubuntu 18安装腾达u12 无线网卡驱动
  14. 20191117 四川大学新生赛划水总结 --__- ...
  15. Python-scrapy爬虫
  16. 新开的淘宝店铺如何运营与推广
  17. pythonGUI实现照片或证件照迅速更换自定义背景底色
  18. 如何通俗易懂地阐述机器学习?
  19. HTV-VIVE 连接 PC端 720云
  20. 微博【黄金分析师吕超】--2.16黄金分析

热门文章

  1. 实现手机端的触屏滑动效果
  2. 贝塞尔曲线-曲线拟合
  3. uni-app 全局变量的几种实现方式
  4. 游戏技巧-《七日杀》存档位置
  5. MMDetection3D 1.1:统一易用的 3D 感知平台
  6. SCP批量拷贝指定文件
  7. 字节跳动二面:你能说说“抖音直播”怎么测试么?
  8. 淘宝店铺装修代码大全
  9. OneNote中英文格式不同,OneNote无法修改英文字体,OneNote默认英文字体为Calibri无法修改的问题。
  10. 7.Android常用第三方支付