一开始还想跟一维一样用懒惰标记,死活搞不出,看到网上有人说二维的只能做到区间查询单点更新,或单点更新区间查询,用不了懒惰标记。释怀了。。。

用标记永久化,也就是说一个节点的标记不用往下传,从顶到下查询节点的时候每遇到一个标记就修改答案就行了。

//#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 二维线段树相关推荐

  1. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

  2. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 1 #include<iostream> 2 #include<math.h> 3 #include<algorithm> 4 #inclu ...

  3. POJ2155 Matrix 二维线段树

    关键词:线段树 二维线段树维护一个 维护一个X线段的线段树,每个X节点维护一个 维护一个Y线段的线段树. 注意,以下代码没有PushDownX.因为如果要这么做,PushDownX时,由于当前X节点的 ...

  4. [POJ2155] Matrix(二维线段树,树套树)

    题目链接:http://poj.org/problem?id=2155 题意:给一个01矩阵,两个操作,翻转:子矩阵里每一个数都由0变1,1变0. 查询:查询某一点是0还是1. 一直以为二维线段树就是 ...

  5. 10.25T2 二维线段树

    Description 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Ai,j. 校长会定期检查一个p*q的 ...

  6. BZOJ2877 NOI2012魔幻棋盘(二维线段树)

    显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...

  7. POJ2155二维线段树

    题意:      给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=5 ...

  8. poj1195 Mobile phones 二维线段树入门

    二维线段树就是树套树,线段树套线段树... #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  9. HDU1823(二维线段树)

    题目:Luck and Love 题意:当操作符为'I'时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值. (100<=H<=200, 0.0& ...

最新文章

  1. default activity not found怎么解决_我怎么也没想到“羽绒服”的英文是down jacket,哪里down了?...
  2. [转]DotNet for Symbian平台 (Nokia,Sony,Motorola等手机)
  3. pytorch中数组维度的理解
  4. 初烧盲狙一条铁三角e40
  5. 0406复利计算5.0--结对
  6. 大数据WEB阶段 Servlet配置优先级 , Spring容器设置对静态资源放行
  7. SAP ABAP, Fiori, Android和Hybris里的异步操作
  8. python缓冲区_如何在Python中使用Google的协议缓冲区
  9. libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
  10. 关于体育的python毕业设计_Python实例13:体育竞技分析
  11. 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)
  12. Android 源码分析(三) Service 启动分析
  13. linux7.1安装教程,Debian Linux 7.1.0 图文安装教程
  14. Mac使用JMeter录制脚本
  15. kali自带发包工具tcpreplay
  16. C# winform 选择文件保存路径
  17. 计算机速成课 第三十七集 机器人
  18. 腾讯企业邮箱免费注册及登录方法
  19. python甲骨文培训
  20. 人工智能中的顶级期刊

热门文章

  1. linux 环境安装Flutter
  2. 二分法(折半查找)的运用之java实现猜数字游戏
  3. Microsoft Jet 数据库引擎找不到输入表或查询. 确定它是否存在如何解决
  4. 12、mybatis返回map单条及多条记录
  5. LeetCode35.搜索插入位置 JavaScript
  6. database disk image is malformed 问题解决
  7. html 5 video audio
  8. idea上一些比较有用的插件
  9. Node.Js从零开始搭建数据管理后台 (一)
  10. 2017甲骨文JavaOne参会感想