CF869 E. The Untended Antiquity 二位树状数组+hash
题意
一个地图,然后三种操作
1.一个矩阵四周加上障碍
2.一个矩阵四周的障碍消除
3.问你两个点之间是否纯在一条路径不经过障碍
题解
我们可以给每一个矩阵一个hash值
然后将矩阵里面的点都加上这个数
如果是撤销障碍就减去
然后判断两个点是否连通就看一下他的数是多少
至于怎么维护这个矩阵加上,我们可以用一个类似差分的思想,然后用树状数组维护一下
就像下图:
然后对于一个点得到他的矩阵和就好了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>using namespace std;int n,m,q;
long long tr[2505][2505];
long long mod=1e9+7;int lb(int x)
{return x&(-x);
}void add(int a,int b,long long v)
{for(int i=a;i<=n;i+=lb(i)){for(int j=b;j<=m;j+=lb(j)){tr[i][j]+=v;}}
}long long get(int a,int b)
{long long ans=0;for(int i=a;i>=1;i-=lb(i)){for(int j=b;j>=1;j-=lb(j)){ans+=tr[i][j];}}return ans;
}
int main()
{while(~scanf("%d%d%d",&n,&m,&q)){memset(tr,0,sizeof(tr));map<pair<pair<int ,int>, pair<int ,int> >,long long > mp;long long id=1;while(q--){int t,a1,b1,a2,b2;scanf("%d%d%d%d%d",&t,&a1,&b1,&a2,&b2);if(t==1){id*=mod;mp[make_pair(make_pair(a1,b1),make_pair(a2,b2))]=id;add(a1,b1,id);add(a2+1,b2+1,id);add(a1,b2+1,-id);add(a2+1,b1,-id);}else if(t==2){long long tid=mp[make_pair(make_pair(a1,b1),make_pair(a2,b2))];add(a1,b1,-tid);add(a2+1,b2+1,-tid);add(a1,b2+1,tid);add(a2+1,b1,tid);}else{long long tp1=get(a1,b1);long long tp2=get(a2,b2);if(tp1==tp2)printf("Yes\n");elseprintf("No\n");}}}
}
CF869 E. The Untended Antiquity 二位树状数组+hash相关推荐
- CodeForces 869E The Untended Antiquity 二维树状数组,随机hash
CodeForces 869E 题意: n*m 的格子,有三种操作, 1.在一个矩形周围加一层障碍.2.把一个矩形周围的障碍去掉. 3.询问两个格子是否可达. 题目保证不会有矩形障碍交叉,且去 ...
- The Untended Antiquity (二维树状数组 哈希)
题意: 3种操作 1 在左上角 (r1,c1).右下角 (r2,c2) 的矩形框上设置围墙 2 把左上角 (r1,c1).右下角 (r2,c2) 的矩形框上的围墙删掉 3 询问 (r1,c1) 能否不 ...
- codeforces869EThe Untended Antiquity(二维树状数组)
/* 二维树状数组+Hash 题意: 给一个地图(n,m) 三种操作: 1,在以(r1,c1).(r2,c2)为对角的矩形四条边上添加障碍 2,消除以(r1,c1).(r2,c2)为对角的矩形四条边上 ...
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维线段树||二维树状数组
http://codeforces.com/contest/869/problem/E 题意:n*m的矩阵,q次操作,三种类型 类型1:给指定矩阵加上围栏 类型2:给指定矩阵去掉围栏 类型3:查询两点 ...
- 【CF869E】The Untended Antiquity(哈希+二维树状数组)
当覆盖两点的最小矩形不同时,一定不可达 这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询 对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号 对于操墙操作 我们可以反着减去这个编号 ...
- szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】
树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...
- P1527 [国家集训队]矩阵乘法 整体二分 + 二维树状数组
传送门 题意: 思路: 算是个整体二分的板子啦,不过这个是二维的矩阵,我们只需要把一位树状数组改成二维的,让后动态维护单点加,区间查询前缀和即可. //#pragma GCC optimize(2) ...
- 【BZOJ3132】【TYVJ1716】上帝造题的七分钟 二维树状数组
题目大意 维护一个\(n\times m\)的矩阵,有两种操作: \(1~x_1~y_1~x_2~y_2~v\):把\((a,b),(c,d)\)为顶点的矩形区域内的所有数字加上\(v\). \(2~ ...
- 二维树状数组(水题) POJ1195
前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用 ...
最新文章
- Objective C浅拷贝和深拷贝
- python映射类型-Python中字典映射类型的学习教程
- apollo 配置中心_Apollo配置中心搭建笔记
- 无符号定点数加法运算的VHDL描述
- linux 查看进程的信号,Linux 进程信号查看与控制
- CentOS安装nextcloud-17.0.0
- 使用 Spring Boot 开发邮件系统
- 交通行业如何做好数字化转型?| 推荐收藏
- 计算机攻防必学科目,网络攻防技术课程实验教学大纲doc.doc
- MAXScript语法及命令
- 《信号与系统》(吴京)部分课后习题答案与解析——第四章(PART2)
- FOC 电流环PI控制器出来后为什么是电压?整定参数跟电机参数有关系吗?
- java中CheckException和UnCheckException的区别
- Intel早期的CPU和现在MCU相比,表现如何?
- 现在学 Prolog 递归
- Win10系统键盘正常但不能输入
- sql注入数据库原理详解
- Python个人项目2 --------青蛙旅行项目
- Opus:IETF低延迟音频编解码器:API和操作手册
- 第四章 脑功能磁共振成像