POJ2155 Matrix 二维线段树
关键词:线段树
二维线段树维护一个 维护一个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 = , MAX_Y = ; struct RangeTree2d
{
private:
bool Rev[MAX_X * ][MAX_Y * ];
int YlMin, YrMax, XlMin, XrMax; void PushDownY(int xCur, int yCur)
{
if (Rev[xCur][yCur])
{
Rev[xCur][yCur * ] ^= ;
Rev[xCur][yCur * + ] ^= ;
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] ^= ;
return;
}
int mid = (sr - sl) / + sl;
if (al <= mid)
UpdateY(xCur, yCur * , sl, mid, al, ar);
if (ar > mid)
UpdateY(xCur, yCur * + , mid + , sr, al, ar);
} void UpdateY(int xCur, int l, int r)
{
UpdateY(xCur, , 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) / ;
if (y <= mid)
return QueryY(xCur, yCur * , l, mid, y);
else
return QueryY(xCur, yCur * + , mid + , r, y);
} bool QueryY(int xCur, int y)
{
return QueryY(xCur, , 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) / + sl;
if (al <= mid)
UpdateX(xCur * , sl, mid, al, ar, yl, yr);
if (ar > mid)
UpdateX(xCur * + , mid + , 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) / ;
if (x <= mid)
QueryX(xCur * , l, mid, x, y, ans);
else
QueryX(xCur * + , mid + , 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(, XlMin, XrMax, xl, xr, yl, yr);
} int Query(int x, int y)
{
bool ans = false;
QueryX(, XlMin, XrMax, x, y, ans);
return ans;
}
}g; int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int totCase;
scanf("%d", &totCase);
while (totCase--)
{
int mSize, qCnt;
scanf("%d%d", &mSize, &qCnt);
g.Init(, mSize, , 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();
}
}
printf("\n");
}
return ;
}
反思:
1.不用动态开点,因为内存够。动态申请内存费时间。
2.不要将问题扩大化为求区域面积,提高了编程复杂度。
POJ2155 Matrix 二维线段树的更多相关文章
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- poj 2155 matrix 二维线段树
题目链接 区间翻转, 单点查询, 查询操作我真是不太明白...... #include <iostream> #include <vector> #include <cs ...
- POJ2155 Matrix 【二维线段树】
题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- [poj2155]Matrix(二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25004 Accepted: 9261 Descripti ...
- ZOJ 1859 Matrix Searching(二维线段树)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...
随机推荐
- 费用流(bzoj 3130)
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
- Redis集群模式配置
redis集群部署安装: https://blog.csdn.net/huwh_/article/details/79242625 https://www.cnblogs.com/mafly/p/re ...
- (4)Swing布局
一.FlowLayout-流布局 新增第一个组件后默认在第一行的居中位置,之后 组件按照加入的先后顺序按照设置的对齐方式从左向右排列 二.borderLayout-边框布局 容器划分为东.西.南.北. ...
- windows安装SUSE Linux Enterprise Server 12
一:打开“开发人员模式” 点击开始菜单按钮,选择“设置” 在设置中选择“更新和安全” 在菜单中选择“针对开发人员”,在三个选项中,选中“开发人员模式” 在弹出的警告框中点击“是” 这样开发人员模式就打 ...
- 2017 ACM/ICPC Asia Regional Beijing Online 记录
题目链接 Beijing
- Centos7安装遇到的问题及详解
1.虚拟机中选择的是NAT模式,我的笔记本电脑是拨号上网,用桥接模式,找不到网卡,在windows的dos界面用ipconfig查看的结果 PPP适配器 宽带连接:IPv4 地址 . . . . . ...
- Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
Java面试题总结之数据结构.算法和计算机基础(刘小牛和丝音的爱情故事1)mp.weixin.qq.com 全文字数: 1703 阅读时间: 大约6 分钟 刘小牛是一名Java程序员,由于天天9 ...
- C# 把控件内容导出图片
Bitmap newbitmap = new Bitmap(panelW.Width, panelW.Height); panelW.DrawToBitmap(newbitmap ...
- IntelliJ IDEA cannot resolved 处理
IntelliJ IDEA cannot resolved 处理 学习了:https://stackoverflow.com/questions/21577573/intellij-idea-can- ...
- WSDL4J解析WSDL文件方法
利用wsdl4j解析WSDL文件 工具:wsdl4j1.6 解析wsdl文件是axis1.4的服务wsdl文件 wsdl文件: <?xml version="1.0" enc ...