题目大意:给你一个全是0的N*N矩阵,每次有两种操作:1将矩阵中一个子矩阵置反,2.查询某个点是0还是1

思路:裸的二维线段树

#include<iostream>
#include<cstdio>
#include <math.h>
#include<algorithm>
#include<string.h>
#include<queue>
#define MOD 1000003
#define maxn 4009
#define LL long long
using namespace std;
int n,num;
bool tree[maxn][maxn];
void add_y(int xx,int node,int l,int r,int ql,int qr)
{
        if(ql<=l && r<=qr){tree[xx][node]^=1;return ;}
        int mid=(l+r)>>1;
        if(ql<mid)add_y(xx,node*2,l,mid,ql,qr);
        if(qr>mid)add_y(xx,node*2+1,mid,r,ql,qr);
}
void add_x(int node,int l,int r,int ql,int qr,int y1,int y2)
{
        if(ql<=l && r<=qr){add_y(node,1,1,n+1,y1,y2);return ;}
        int mid=(l+r)>>1;
        if(ql<mid)add_x(node*2,l,mid,ql,qr,y1,y2);
        if(qr>mid)add_x(node*2+1,mid,r,ql,qr,y1,y2);
}
void query_y(int xx,int node,int l,int r,int y1)
{
        if(tree[xx][node]==1)num++;
        if(l+1==r)return ;
        int mid=(l+r)>>1;
        if(y1<mid)query_y(xx,node*2,l,mid,y1);
        else query_y(xx,node*2+1,mid,r,y1);
}
void query_x(int node,int l,int r,int x1,int y1)
{
        query_y(node,1,1,n+1,y1);
        if(l+1==r)return ;
        int mid=(l+r)>>1;
        if(x1<mid)query_x(node*2,l,mid,x1,y1);
        else query_x(node*2+1,mid,r,x1,y1);
}
int main()
{
        int t,m,x1,x2,y1,y2;
        char ch[10];
        scanf("%d",&t);
        while(t--)
        {
                memset(tree,0,sizeof(tree));
                scanf("%d%d",&n,&m);
                for(int i=1;i<=m;i++)
                {
                        scanf("%s",ch+1);
                        if(ch[1]=='C')
                        {
                                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                                add_x(1,1,n+1,x1,x2+1,y1,y2+1);
                        }
                        else
                        {
                                num=0;
                                scanf("%d%d",&x1,&y1);
                                query_x(1,1,n+1,x1,y1);
                                printf("%d\n",num&1);
                        }
                }
                printf("\n");
        }
        return 0;
}

POJ 2155 Matrix【二维线段树】的更多相关文章

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

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

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

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

  3. poj 2155 matrix 二维线段树

    题目链接 区间翻转, 单点查询, 查询操作我真是不太明白...... #include <iostream> #include <vector> #include <cs ...

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

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

  5. POJ2155 Matrix 二维线段树

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

  6. POJ 2155 Matrix(二维树状数组,绝对具体)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20599   Accepted: 7673 Descripti ...

  7. poj 2155 Matrix (二维树状数组)

    题意:给你一个矩阵开始全是0,然后给你两种指令,第一种:C x1,y1,x2,y2 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转,0变1,1变0 第二种:Q x1 y1,输 ...

  8. POJ 2155 Matrix(二维BIT)

    Matrix [题目链接]Matrix [题目类型]二维BIT &题解: bit只能单点更新,恰好,这题可以想一下就可以用单点更新解决了. 只不过最后我交上去居然T了,想了10多分钟,试了一下 ...

  9. POJ 2019 Cornfields 二维线段树的初始化与最值查询

    模板到不行.. 连更新都没有.. .存个模板. 理解留到小结的时候再写. #include <algorithm> #include <iostream> #include & ...

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

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

随机推荐

  1. React Native 手工搭建环境 之iOS篇

    常识 React native 开发服务器 在开发时,我们的框架是这样的:  当正式发布进入到生产环境时,开发服务器上所有的js文件将会被编译成包的形式,直接嵌入到客户端内.这时,已经不再需要开发服 ...

  2. java 中设计模式

    1. 单例模式(一个类只有一个实例) package ch.test.notes.designmodel; /** * Description: 单例模式 (饿汉模式 线程安全的) * * @auth ...

  3. 转 在Qt中用QAxObject来操作Excel

    最近写程序中需要将数据输出保存到Excel文件中.翻看<C++ GUI Programming with Qt 4>(Second Edition)发现可以在Qt中运用ActiveX控件, ...

  4. 优化SQL语句的方法

    首先,对于where语句的注意事项: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where nu ...

  5. selenium-介绍和安装

    前戏 相信大家对web自动化selenium都不陌生,是一个web自动化框架,我在第一家公司的时候,产品是两个星期一个版本,每一次发布测试都要进行回归测试,也就是大家说的点点点,后来我就想,能不能做成 ...

  6. Java递归获取部门树 返回jstree数据

    @GetMapping("/getDept")@ResponseBodypublic Tree<DeptDO> getDept(String deptId){ Tree ...

  7. spring中常用的注解

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...

  8. shell脚本,tee小工具的用法。

    解释: tee是个工具 , 它的作用就是把标准输出,复制一份,扔文件里 ,原标准输出还输出,-a就相当于 >> 追加到文件里的意思.  不加就是 > 重定向到文件里去.

  9. UISearchBar的使用

    searchBar = [[UISearchBar alloc] initWithFrame: CGRectMake(0.0, 0.0, self.view.bounds.size.width, 40 ...

  10. Mac电脑怎么显示隐藏文件、xcode清除缓存

    1.删除Xcode中多余的证书provisioning profile 手动删除: Xcode6 provisioning profile path: ~/Library/MobileDevice/P ...