博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 869E The Untended Antiquity
阅读量:4977 次
发布时间:2019-06-12

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

题意:给定一个网格图,三种操作:1.在(r1,c1,r2,c2)处建围墙。2.删除(r1,c1,r2,c2)处的围墙。3.询问两点是否可达

 

思路比较巧妙,将围墙内的点赋加一个权值,询问的时候判断两个点的权是否相等即可。显然可以用二维树状数组实现。

#include
using namespace std;#define MAXN 2500+10typedef long long LL;const int seed=2333;LL sum[MAXN][MAXN],n,m,q;int lowbit(int x){
return x&(-x);}void add(int x,int y,LL val){ for(int i=x;i <= n;i+=lowbit(i)) for(int j=y;j <= m;j+=lowbit(j)) sum[i][j]+=val;}void update(int x1,int y1,int x2,int y2,LL val){ add(x1,y1,val); add(x1,y2+1,-val); add(x2+1,y1,-val); add(x2+1,y2+1,val);}LL query(int x,int y){ LL tot=0; for(int i=x;i;i-=lowbit(i)) for(int j=y;j;j-=lowbit(j)) tot+=sum[i][j]; return tot;}int main(){ scanf("%d%d%d",&n,&m,&q); while(q--){ int opt,x1,y1,x2,y2; scanf("%d%d%d%d%d",&opt,&x1,&y1,&x2,&y2); LL val=x1; val=val*seed+y1; val=val*seed+x2; val=val*seed+y2; if(opt==1)update(x1,y1,x2,y2,val); else if(opt==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;}

 

转载于:https://www.cnblogs.com/NINGLONG/p/7674181.html

你可能感兴趣的文章
[SDOI2008]洞穴勘测
查看>>
Difference between Linearizability and Serializability
查看>>
IDEA使用操作文档
查看>>
UIView
查看>>
添加日期选择控件
查看>>
bzoj4765: 普通计算姬 (分块 && BIT)
查看>>
看完漫画秒懂区块链
查看>>
Oracle命令类别
查看>>
stc12c5a60s2驱动TEA5767收音机模块硬件调试总结
查看>>
vue中提示$index is not defined
查看>>
css选择器
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Spring中使用Velocity模板
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>
day02
查看>>
gvim 配置Pydiction
查看>>
Linux安装指定mysql版本
查看>>
分布式锁的三种实现方式
查看>>