关键词:线段树

二维线段树维护一个 维护一个X线段的线段树,每个X节点维护一个 维护一个Y线段的线段树。

注意,以下代码没有PushDownX。因为如果要这么做,PushDownX时,由于当前X节点的子节点可能存在标记,而标记不能叠加,导致每次PushDownX时都要把子节点PushDownX一次。每次PushDownX都要对子节点UpdateY,代价太高。这种情况下原则是:只有查询操作<<更新操作时才PushDownX。

#include <cstdio>
#include <cstring>
#include <cassert>
#include <vector>
using namespace std;const int MAX_X = 2000, MAX_Y = 2000;struct RangeTree2d
{private:bool Rev[MAX_X * 4][MAX_Y * 4];int YlMin, YrMax, XlMin, XrMax;void PushDownY(int xCur, int yCur){if (Rev[xCur][yCur]){Rev[xCur][yCur * 2] ^= 1;Rev[xCur][yCur * 2 + 1] ^= 1;Rev[xCur][yCur] = false;}}void UpdateY(int xCur, int yCur, int sl, int sr, int al, int ar){assert(sl <= sr&&al <= ar&&al <= sr&&ar >= sl);if (al <= sl&&sr <= ar){Rev[xCur][yCur] ^= 1;return;}int mid = (sr - sl) / 2 + sl;if (al <= mid)UpdateY(xCur, yCur * 2, sl, mid, al, ar);if (ar > mid)UpdateY(xCur, yCur * 2 + 1, mid + 1, sr, al, ar);}void UpdateY(int xCur, int l, int r){UpdateY(xCur, 1, YlMin, YrMax, l, r);}bool QueryY(int xCur, int yCur, int l, int r, int y){if (l == r)return Rev[xCur][yCur];PushDownY(xCur, yCur);int mid = (l + r) / 2;if (y <= mid)return QueryY(xCur, yCur * 2, l, mid, y);elsereturn QueryY(xCur, yCur * 2 + 1, mid + 1, r, y);}bool QueryY(int xCur, int y){return QueryY(xCur, 1, YlMin, YrMax, y);}void UpdateX(int xCur, int sl, int sr, int al, int ar, int yl, int yr){//printf("C x:sl %d sr %d al %d  ar %d\n", sl, sr, al, ar);assert(sl <= sr&&al <= ar&&al <= sr&&ar >= sl);if (al <= sl&&sr <= ar){UpdateY(xCur, yl, yr);return;}int mid = (sr - sl) / 2 + sl;if (al <= mid)UpdateX(xCur * 2, sl, mid, al, ar, yl, yr);if (ar > mid)UpdateX(xCur * 2 + 1, mid + 1, sr, al, ar, yl, yr);}void QueryX(int xCur, int l, int r, int x, int y, bool &ans){ans ^= QueryY(xCur, y);if (l == r)return;int mid = (l + r) / 2;if (x <= mid)QueryX(xCur * 2, l, mid, x, y, ans);elseQueryX(xCur * 2 + 1, mid + 1, r, x, y, ans);}public:void Init(int xlMin, int xrMax, int ylMin, int yrMax){XlMin = xlMin;XrMax = xrMax;YlMin = ylMin;YrMax = yrMax;memset(Rev, false, sizeof(Rev));}void Update(int xl, int xr, int yl, int yr){UpdateX(1, XlMin, XrMax, xl, xr, yl, yr);}int Query(int x, int y){bool ans = false;QueryX(1, XlMin, XrMax, x, y, ans);return ans;}
}g;int main()
{
#ifdef _DEBUGfreopen("c:\\noi\\source\\input.txt", "r", stdin);
#endifint totCase;scanf("%d", &totCase);while (totCase--){int mSize, qCnt;scanf("%d%d", &mSize, &qCnt);g.Init(1, mSize, 1, mSize);while (qCnt--){char op;int x1, x2, y1, y2;scanf("\n%c", &op);switch (op){case 'C':scanf("%d%d%d%d", &x1, &y1, &x2, &y2);g.Update(x1, x2, y1, y2);break;case 'Q':scanf("%d%d", &x1, &y1);printf("%d\n", g.Query(x1, y1));break;default:assert(0);}}printf("\n");}return 0;
}

反思:

1.不用动态开点,因为内存够。动态申请内存费时间。

2.不要将问题扩大化为求区域面积,提高了编程复杂度。

转载于:https://www.cnblogs.com/headboy2002/p/8443731.html

POJ2155 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. POJ 2155 Matrix 二维线段树

    一开始还想跟一维一样用懒惰标记,死活搞不出,看到网上有人说二维的只能做到区间查询单点更新,或单点更新区间查询,用不了懒惰标记.释怀了... 用标记永久化,也就是说一个节点的标记不用往下传,从顶到下查询 ...

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

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

  5. POJ2155二维线段树

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

  6. 10.25T2 二维线段树

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

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

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

  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. IDEA 中的神奇插件:防沉迷、防猝死...
  2. 【运筹学】人工变量法总结 ( 人工变量法解的分析 | 标准型变换 | 构造单位阵 | 目标函数引入 M | 计算检验数 | 选择入基变量 | 选择出基变量 | 中心元变换 | ) ★★
  3. oracle ctl file constantnull,Oracle 的一些导入和导出方法
  4. P2444-[POI2000]病毒【AC自动机】
  5. java xca碗组口径,公路车常见杂音检查清单和解决方法(图文)
  6. 机器手六维坐标怎么定义_机器人学——2.4-坐标系的旋转和运动增量
  7. 第 二 十 八 天 :监 控 软 件 之 cacti
  8. XP---VS05---部署个人网站初学者工具包---方案
  9. css 文本两端对齐终极解决方案--一丝冰凉
  10. Spring Boot - Mybatis 缓存
  11. 有什么软件可以测试游戏视频数据,免费录制游戏视频软件有哪些?看完你就知道了...
  12. GitHub 中国区前 100 名到底是什么样的人
  13. 读书笔记——阿里数据中台(第一篇:数据中台顶层设计)
  14. psp记忆棒测试软件,乱花渐欲迷人眼——PSP用记忆棒选购指南
  15. Linux网卡bond
  16. ffmpeg的中文文档(二)
  17. win10下安装tensorflow+cuda8.0.61+cudnn5.1+python3.5(附cuda和相对于的cudnn版本网盘下载)
  18. 青奥项目的渡江战役哦 哈哈哈
  19. 数据库原理 数据库镜像
  20. 使用python自动寻找抖音上漂亮的小姐姐,再也不愁没有小姐姐看

热门文章

  1. 关于读《ajax后退解决方案(一)》笔记
  2. .net导出为powerpoint的一些参考代码
  3. 【恋上数据结构】串匹配算法(蛮力匹配、KMP【重点】、Boyer-Moore、Karp-Rabin、Sunday)
  4. JZ32变形~剑指 Offer 32 - II. 从上到下打印二叉树 II
  5. 小程序入门学习13--云函数与数据库02
  6. 从理论上来说,国足是否还有出线的可能性?分析数据后给你答案
  7. 前阿里财务人告诉你:抛弃Excel,原来报表竟然还能这么快
  8. 10年老分析师最终抛弃Excel,它不是最好的数据分析工具
  9. 案例分享|数据可视化下的驱动业务增长
  10. 数据分析学习笔记——Pandas库思维导图