POJ 2155 Matrix 二维线段树
一开始还想跟一维一样用懒惰标记,死活搞不出,看到网上有人说二维的只能做到区间查询单点更新,或单点更新区间查询,用不了懒惰标记。释怀了。。。
用标记永久化,也就是说一个节点的标记不用往下传,从顶到下查询节点的时候每遇到一个标记就修改答案就行了。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath> #include<climits> #include<string> #include<map> #include<queue> #include<vector> #include<stack> #include<set> using namespace std; typedef long long ll; typedef pair<int,int> pii; #define pb(a) push_back(a) #define INF 0x1f1f1f1f #define lson idx<<1,l,mid #define rson idx<<1|1,mid+1,r #define PI 3.1415926535898 template<class T> T min(const T& a,const T& b,const T& c) {return min(min(a,b),min(a,c)); } template<class T> T max(const T& a,const T& b,const T& c) {return max(max(a,b),max(a,c)); } void debug() { #ifdef ONLINE_JUDGE #elsefreopen("d:\\in.txt","r",stdin);// freopen("d:\\out1.txt","w",stdout); #endif } int getch() {int ch;while((ch=getchar())!=EOF) {if(ch!=' '&&ch!='\n')return ch;}return EOF; } bool res; const int maxn=1000; struct sub_tree {int v[maxn<<2];int build(){memset(v,0,sizeof(v));return 0;}int update(int idx,int l,int r,int tl,int tr){if(tl<=l&&tr>=r){v[idx]^=1;return 0;}int mid=(r+l)>>1;if(tl<=mid)update(lson,tl,tr);if(tr>mid)update(rson,tl,tr);return 0;}int query(int idx,int l,int r,int a){res^=v[idx];if(l==r)return 0;int mid=(r+l)>>1;if(a<=mid)return query(lson,a);else return query(rson,a);} }; sub_tree tree[maxn<<2]; int n; void build(int idx,int l,int r) {tree[idx].build();if(l==r)return ;int mid=(r+l)>>1;build(lson);build(rson); } int update(int idx,int l,int r,int tlx,int trx,int tla,int tra) {if(tlx<=l&&trx>=r){tree[idx].update(1,1,n,tla,tra);return 0;}int mid=(r+l)>>1;if(tlx<=mid)update(lson,tlx,trx,tla,tra);if(trx>mid)update( rson,tlx,trx,tla,tra);return 0; } int query(int idx,int l,int r,int x,int y) {tree[idx].query(1,1,n,y);if(l==r)return 0;int mid=(r+l)>>1;if(x<=mid)return query(lson,x,y);else return query(rson,x,y); } int main() {debug();int t;scanf("%d",&t);for(int ca=1;ca<=t;ca++){int q;scanf("%d%d",&n,&q);build(1,1,n);for(int i=1;i<=q;i++){char op[10];scanf("%s",op);if(op[0]=='C'){int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);update(1,1,n,x1,x2,y1,y2);}else{int x,y;scanf("%d%d",&x,&y);res=0;query(1,1,n,x,y);printf("%d\n",res);}}}return 0; }
View Code
转载于:https://www.cnblogs.com/BMan/p/3312492.html
POJ 2155 Matrix 二维线段树相关推荐
- POJ-2155 Matrix 二维线段树 | 树状数组
题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 1 #include<iostream> 2 #include<math.h> 3 #include<algorithm> 4 #inclu ...
- POJ2155 Matrix 二维线段树
关键词:线段树 二维线段树维护一个 维护一个X线段的线段树,每个X节点维护一个 维护一个Y线段的线段树. 注意,以下代码没有PushDownX.因为如果要这么做,PushDownX时,由于当前X节点的 ...
- [POJ2155] Matrix(二维线段树,树套树)
题目链接:http://poj.org/problem?id=2155 题意:给一个01矩阵,两个操作,翻转:子矩阵里每一个数都由0变1,1变0. 查询:查询某一点是0还是1. 一直以为二维线段树就是 ...
- 10.25T2 二维线段树
Description 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Ai,j. 校长会定期检查一个p*q的 ...
- BZOJ2877 NOI2012魔幻棋盘(二维线段树)
显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...
- POJ2155二维线段树
题意: 给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=5 ...
- poj1195 Mobile phones 二维线段树入门
二维线段树就是树套树,线段树套线段树... #include<iostream> #include<cstdio> #include<cstring> #inclu ...
- HDU1823(二维线段树)
题目:Luck and Love 题意:当操作符为'I'时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值. (100<=H<=200, 0.0& ...
最新文章
- default activity not found怎么解决_我怎么也没想到“羽绒服”的英文是down jacket,哪里down了?...
- [转]DotNet for Symbian平台 (Nokia,Sony,Motorola等手机)
- pytorch中数组维度的理解
- 初烧盲狙一条铁三角e40
- 0406复利计算5.0--结对
- 大数据WEB阶段 Servlet配置优先级 , Spring容器设置对静态资源放行
- SAP ABAP, Fiori, Android和Hybris里的异步操作
- python缓冲区_如何在Python中使用Google的协议缓冲区
- libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
- 关于体育的python毕业设计_Python实例13:体育竞技分析
- 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)
- Android 源码分析(三) Service 启动分析
- linux7.1安装教程,Debian Linux 7.1.0 图文安装教程
- Mac使用JMeter录制脚本
- kali自带发包工具tcpreplay
- C# winform 选择文件保存路径
- 计算机速成课 第三十七集 机器人
- 腾讯企业邮箱免费注册及登录方法
- python甲骨文培训
- 人工智能中的顶级期刊