题意:

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

思路:

     做的有点蛋疼,昨天自己用了将近5个小时自己研究了两个二维线段树的算法,都失败了,其实我想到的第二个算法和网上那个差不多(后来看网上的思路才发现),但是我考虑的是段更新的PushDown的问题,其实这个题目是段更新,*点询问*,根据这个可以简化问题,思路很容易想到可以是线段树的线段树,就是线段树跑X确定区间后再线段树去更新y,但是有几点需要注意

1. 可以不用Pushup,Pushdown(因为是点询问,一开始我就考虑段询问,各种自己设想,研究而且还写了个上下左右更新,就是把线段映射成平面,最后悲剧了..你懂的)

2.*当更新大矩形的时候那么他里面的小矩形也相当于更新了,就是假如现在更新

(1,1)(5,5)(1,5),(5,1)这个矩形的时候我们是找到位置直接就return了,其实(1,1)(2,2),(1,2),(2,1)也更新了,但是我们没有继续往下走,所以当我们寻找答案的时候要一路加过来,这个是重点,这么说可能不懂,但是可以看几遍代码,我当时看了下代码马上就懂了,可能是我昨天想的要比正解难很多,想到头疼,而且思路相近,所以一看就懂了,但是不管是谁,只要考虑过,应该很容易懂,很可惜下面的代码的思路并不是我自己想出来的。


#include<stdio.h>
#include<string.h> #define xlson xl ,xmid ,xt << 1
#define xrson xmid+1 ,xr ,xt << 1 | 1
#define ylson yl ,ymid ,yt << 1
#define yrson ymid+1 ,yr ,yt << 1 | 1
#define N 1005 int cnt[N<<2][N<<2] ,n ,ans;
void UpdateY(int yl ,int yr ,int yt ,int c ,int d ,int xt)
{
if(c <= yl && d >= yr)
{
cnt[xt][yt] ++;
return ;
}
int ymid = (yl + yr) >> 1;
if(c <= ymid) UpdateY(ylson ,c ,d ,xt);
if(d > ymid) UpdateY(yrson ,c ,d ,xt);
return ;
} void UpdateX(int xl ,int xr ,int xt ,int a ,int b ,int c ,int d)
{
if(a <= xl && b >= xr)
{
UpdateY(1 ,n ,1 ,c ,d ,xt);
return ;
}
int xmid = (xl + xr) >> 1;
if(a <= xmid) UpdateX(xlson ,a ,b ,c ,d);
if(b > xmid) UpdateX(xrson ,a ,b ,c ,d);
return ;
} void QueryY(int yl ,int yr ,int yt ,int b ,int xt)
{
ans += cnt[xt][yt];
if(yl == yr) return ;
int ymid = (yl + yr) >> 1;
if(b <= ymid) QueryY(ylson ,b ,xt);
else QueryY(yrson ,b ,xt);
return ; } void QueryX(int xl ,int xr ,int xt ,int a ,int b)
{
QueryY(1 ,n ,1 ,b ,xt);
if(xl == xr) return ;
int xmid = (xl + xr) >> 1;
if(a <= xmid) QueryX(xlson ,a ,b);
else QueryX(xrson ,a ,b);
return ;
} int main ()
{
int t ,m ,i ,x1 ,y1 ,x2 ,y2;
char str[5];
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
memset(cnt ,0 ,sizeof(cnt));
while(m--)
{
scanf("%s" ,str);
if(str[0] == 'C')
{
scanf("%d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2);
UpdateX(1 ,n ,1 ,x1 ,x2 ,y1 ,y2);
}
else
{
scanf("%d %d" ,&x1 ,&y1);
ans = 0;
QueryX(1 ,n ,1 ,x1 ,y1);
if(ans % 2)
printf("1\n");
else printf("0\n");
}
}
if(t) printf("\n");
}
return 0;
}

POJ2155二维线段树的更多相关文章

  1. POJ2155 Matrix 【二维线段树】

    题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...

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

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

  3. POJ2155 Matrix 二维线段树

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

  4. 二维线段树 poj-2155

    题意:t组样例 ,输入 n,m,表示n*n的矩阵进行m次操作 ,C: 输入两个坐标 ,组成的矩形 进行取反操作 ,Q:对输的坐标位置输入其值. 思路:一开始想的是用1000(表示x轴)个线段树(对每段 ...

  5. POJ 2155 Matrix (二维线段树)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226   Accepted: 6461 Descripti ...

  6. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  7. HDU 1823 Luck and Love(二维线段树)

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

  8. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

  9. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

随机推荐

  1. CCF(通信网络):简单DFS+floyd算法

    通信网络 201709-4 一看到题目分析了题意之后,我就想到用floyd算法来求解每一对顶点的最短路.如果一个点和任意一个点都有最短路(不为INF),那么这就是符合的一个答案.可是因为题目超时,只能 ...

  2. ThinVnc-身份验证绕过(CVE-2019-17662)

    ThinVnc-身份验证绕过(CVE-2019-17662) 简介 ThinVNC是一款以网页浏览器为基础设计的远端桌面连接工具,不局限用户端使用那种作业平台,都可以通过采用HTML5为标准的浏览器来 ...

  3. linux时间问题

    如果遇到创建时间和更新时间,不一致,先将时间调整为一致. 导致不一致的原因可能是时区不对,使用 tzselect ,将时区调整为Asia/Shanghai , cp /usr/share/zonein ...

  4. Python3读取网页HTML代码,并保存在本地文件中

    旧版Python中urllib模块内有一个urlopen方法可打开网页,但新版python中没有了,新版的urllib模块里面只有4个子模块(error,request,response,parse) ...

  5. css实现0.5像素的底边框。

    由于设计图的1px在移动端开发中的像素比是2倍,在实际开发中却是需要1px的线条,虽然最直接的方式是将线条设置为0.5px,但有些移动端对于0.5px的解析为0,变成了无边框的显示.因此处理该需求我们 ...

  6. BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】

    一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...

  7. hexo+github 博客绑定域名

    关于博客的搭建分为以下几步: 申请域名可以在万维网上申请一个自己的独特域名,本博客的域名即为zhengwei.xyz. 域名解析域名申请成功后继续在万维网上进行操作,进入管理自己的域名界面,在要解析的 ...

  8. springmvc 最权威的知识点

    1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,C ...

  9. 【linux】驱动-2-内核模块

    目录 前言 2. 内核模块 2.1 内核模块概念 2.1.1 内核 2.1.2 内核模块机制的引入 2.2 内核模块 2.2.1 内核模块参考例程 2.2.2 内核模块命令 2.2.3 系统自动加载模 ...

  10. vue 快速入门 系列 —— 侦测数据的变化 - [基本实现]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [基本实现] 在 初步认识 vue 这篇文章的 hello-world 示例中,我们通过修改数据(app.seen = false),页面中 ...