本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样,又不好打。。。也可能是我这是在套用一维线段树的思想,还有更好的二维线段树懒惰标记方法

反正到现在我还没搞定二维线段树的懒惰标记,因为这道题不用懒惰标记,因为是二进制序列,区间修改仅限于翻转操作,那就只要记录每次操作,最后查询的时候从上往下把所有修改都来上一遍,就可以了。就类似于树状数组的第二种用法,每次区间修改,最后查询的时候把前面的修改都给加起来。

即区间修改的时候,定位到某段某区间列进行标记,单独查询的时候,针对每个行段的该列所在区间都遍历一遍,把所有的修改都遍历到之后就是结果了

#include <iostream>
#include <cstdio>
#include <cstring>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int N=1010;
int d[N*3][N*3];
int flag[N*3][N*3];
int n,Q;
void buildc(int k,int rt,int l,int r)
{
d[k][rt]=0;
if (l>=r){
return;
}
int mid=(l+r)>>1;
buildc(k,lson);
buildc(k,rson);
}
void buildr(int rt,int l,int r)
{
buildc(rt,1,1,n);
if (l>=r){
return;
}
int mid=(l+r)>>1;
buildr(lson);
buildr(rson);
} void fixc(int k,int c1,int c2,int rt,int l,int r)
{
if (c1<=l && r<=c2){
d[k][rt]^=1;
return;
}
int mid=(l+r)>>1;
if (c1>mid) fixc(k,c1,c2,rson);
else
if (c2<=mid) fixc(k,c1,c2,lson);
else{
fixc(k,c1,c2,lson);
fixc(k,c1,c2,rson);
}
}
void fixr(int r1,int r2,int c1,int c2,int rt,int l,int r)
{
if (r1<=l && r<=r2){
fixc(rt,c1,c2,1,1,n);
return;
}
int mid=(l+r)>>1;
if (r1>mid) fixr(r1,r2,c1,c2,rson);
else
if (r2<=mid) fixr(r1,r2,c1,c2,lson);
else{
fixr(r1,r2,c1,c2,lson);
fixr(r1,r2,c1,c2,rson);
}
}
void queryc(int& ans,int k,int C,int rt,int l,int r)
{
if (d[k][rt]){
ans^=1;
}
if (l>=r){
return ;
}
int mid=(l+r)>>1;
if (mid>=C)
queryc(ans,k,C,lson);
else
queryc(ans,k,C,rson);
}
void queryr(int& ans,int R,int C,int rt,int l,int r)
{
queryc(ans,rt,C,1,1,n);
if (l>=r){
return;
}
int mid=(l+r)>>1;
if (R<=mid) queryr(ans,R,C,lson);
else
queryr(ans,R,C,rson);
}
int main()
{
char ch[5];
int a,b,c,d;
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&Q);
buildr(1,1,n);
while (Q--)
{
scanf("%s",ch);
if (ch[0]=='C'){
scanf("%d%d%d%d",&a,&b,&c,&d);
fixr(a,c,b,d,1,1,n);
}
else {
scanf("%d%d",&a,&b);
int ans=0;
queryr(ans,a,b,1,1,n);
printf("%d\n",ans);
}
}
if (t) puts("");
}
return 0;
}

  

POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询的更多相关文章

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

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

  2. POJ 2155 2维线段树 || 2维BIT

    #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...

  3. poj 2155 matrix 二维线段树 线段树套线段树

    题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...

  4. POJ 1195 2维线段树(树套树实现) 树状数组

    1: #include <stdio.h> 2: #include <string.h> 3: #include <stdlib.h> 4: #include &l ...

  5. BZOJ4785 ZJOI2017树状数组(概率+二维线段树)

    可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...

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

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

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

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

  8. POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)

    题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...

  9. POJ 2155 Matrix【二维线段树】

    题目大意:给你一个全是0的N*N矩阵,每次有两种操作:1将矩阵中一个子矩阵置反,2.查询某个点是0还是1 思路:裸的二维线段树 #include<iostream>#include< ...

随机推荐

  1. siblings() 获取同胞元素的用法

    1. $("h2").siblings().css({"color":"red","border":"2px ...

  2. 读取json文件

    //读取json文件 var obji = File.ReadAllText(@"E:\test.json"); var resultdata = JsonConvert.Dese ...

  3. 夯实Java基础(十五)——Java中Comparable和Comparator

    1.前言 对于Java中的对象,我们只能使用基本运算符==.!=来判断一下地址是否相等,不能使用>.<来比较大小.但是在实际的开发中,我们需要对对象进行排序,也就是比较大小,那么应该如何实 ...

  4. kafka-console-consumer接收不到flume推送过来的消息

    原因和解决方法:需要先启动kafka,再启动flume,两者启动有先后顺序.

  5. SystemVerilog基本语法总结(中)

    Systemverilog 语法总结(中) 上一个博客分享了SV基本的概念,这一博客继续分享,等下一个博客分享一个公司的验证的笔试题目. l 事件 背景: Verilog中当一个线程在一个事件上发生阻 ...

  6. 「NOIP2015」运输计划

    传送门 Luogu 解题思路 首先这题可以直接二分答案,然后我们每次都把属于长度大于二分值的路径上的边标记一次,表示选这条边可以优化几条路径. 然后我们显然是要选一条覆盖次数等于需要覆盖的路径数并且长 ...

  7. 常用mac/unix/linux命令

    1.查询ip地址 ifconfig 2.查找服务器上应用程序的端口分配 grep telnet /etc/services (telnet) telnet使用TCP/UDP端口号23 grep dom ...

  8. vue ref父子组件传值

    一. ref使用在父组件上 父组件html: <information ref='information'></information> import information ...

  9. 发送短信-----用restful 校验规则

    我们的需求如下 1. 获取手机号 . 手机格式校验 . 生成随机验证码 . 验证码发送到手机上 . 把验证码+手机号保留(30s过期) 复习 我们在有表的情况下的序列化 class MessageSe ...

  10. Google宣布安全奖励项目(GPSRP)覆盖上亿的 Android 应用程序

    自 2010 年推出除虫赏金项目以来,谷歌已经向安全研究人员支付了超过 1500 万美元的奖励.今天,这家科技巨头宣布进一步拓展 Google Play 安全奖励项目(GPSRP)的范围,以覆盖上亿的 ...