1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > CF869 E. The Untended Antiquity 二位树状数组+hash

CF869 E. The Untended Antiquity 二位树状数组+hash

时间:2019-02-28 08:08:15

相关推荐

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");}}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。