题意

一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找

题解

任意一种能维护二维平面的数据结构都可以

我这里写的是二维线段树,
因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维线段树

简单来说就是每个点都维护了一颗线段树...

因为二维线段树难以实现pushdown,而他的查找又是单点的

于是具体思路类似标记永久化,记录经过的点上的修改次数,最后判断修改次数的奇偶性即可

//为什么不写构造函数和vector?

//因为这是神奇的poj...

#include<iostream>
#include<string>
#include<vector>
#include<string.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
using namespace std;
const int maxn=4e3+10,maxm=2e6+10;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
int casn,n,m,k,d;
class sstree{
#define nd node[nowx][nowy]
public:
struct segnode {int val;};
// vector<vector<segnode> > node;
int n,m,x1,x2,y1,y2,x,nowx;
int ans;
segnode node[maxn][maxn];
void init(int nn,int mm) {
n=nn,m=mm;
memset(node ,0,sizeof node);
// node.resize(n*4+10);
// rep(i,0,(n*4+9)) node[i].resize(m*4+10);
}
void update(int xx1,int xx2,int yy1,int yy2){
x1=xx1,y1=yy1,x2=xx2,y2=yy2;
updatex(1,n);
}
void updatey(int l,int r,int nowy=1){
if(y1>r||y2<l) return ;
if(y1<=l&&y2>=r){nd.val^=1;return ;}
updatey(l,(l+r)>>1,nowy<<1); updatey(((l+r)>>1)+1,r,nowy<<1|1);
}
void updatex(int l,int r,int now=1){
if(x1>r||x2<l) return ;
if(x1<=l&&x2>=r) {nowx=now;updatey(1,m);return ;}
updatex(l,(l+r)>>1,now<<1); updatex(((l+r)>>1)+1,r,now<<1|1);
}
int query(int xx,int yy){
x1=xx,y1=yy;ans=0;
queryx(1,n);
return ans;
}
void queryy(int l,int r,int nowy=1){
if(y1>r||y1<l) return ;
ans^=nd.val;
if(l==r) return ;
queryy(l,(l+r)>>1,nowy<<1);queryy(((l+r)>>1)+1,r,nowy<<1|1);
}
void queryx(int l,int r,int now=1){
if(x1>r||x1<l) return ;
nowx=now;queryy(1,m);
if(l==r) return ;
queryx(l,(l+r)>>1,now<<1);queryx(((l+r)>>1)+1,r,now<<1|1);
}
}tree;
int main() {
IO;
cin>>casn;
register int a,b,c,d;
string s;
while(casn--){
cin>>n>>m;
tree.init(n,n);
while(m--){
cin>>s;
if(s[0]=='C') {
cin>>a>>b>>c>>d;
tree.update(a,c,b,d);
}else {
cin>>a>>b;
cout<<tree.query(a,b)<<endl;
}
}
if(casn) cout<<endl;
}
}

poj 2155 matrix 二维线段树 线段树套线段树的更多相关文章

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

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

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

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

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

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

  4. POJ 2155 Matrix(二维BIT)

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

  5. poj 2155 matrix 二维线段树

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

  6. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

  7. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  8. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  9. POJ poj 2155 Matrix

    题目链接[http://poj.org/problem?id=2155] /* poj 2155 Matrix 题意:矩阵加减,单点求和 二维线段树,矩阵加减,单点求和. */ using names ...

随机推荐

  1. 手把手教你发布一个Python包

    本文主题如下: 编写一个包(Python 源代码),但不是本文的重点. 编译包,观察编译后的文件. 发布包,发布的包可以有多种类型. 如何在 Pypi 中查看已发布的包 注意: 本文编写的包在 Pyt ...

  2. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

  3. Nginx部署静态页

    简答说一下如何用Nginx部署静态网页,并绑定域名访问 1.通过FTP上传静态页到服务器指定目录 2.编写nginx的.conf文件 3.重启nginx 如图,这是centos上传文件路径 nginx ...

  4. ES7

    本文是自己所学的ES7的一些常用的新特性: 一.padStart()方法,padEnd()方法: 如果某个字符串不够指定长度,有两个方法可以在头部或尾部补全.padStart()用于头部补全,padE ...

  5. Jmeter录制手机app脚本

    转:http://www.cnblogs.com/yangxia-test/p/5484616.html   环境准备: 1.手机 2.wifi 3.Jmeter   具体步骤: 1.启动Jmeter ...

  6. 深入理解AMQP协议转载

    转自https://blog.csdn.net/weixin_37641832/article/details/83270778 文章目录 一.AMQP 是什么二.AMQP模型工作过程深入理解三.Ex ...

  7. Redis的发布与订阅

    业务: 运用数据与信息指导小药工的采购生产与销售行为 需求背景: (1)药工汇小程序用户(即小型中药初加工用户)需要知道自己加工的品种的价格涨跌信息和品种相关资讯) 需求分析拆解: (1)使用爬虫程序 ...

  8. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  9. 初识 go 语言:方法,接口及并发

    目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...

  10. python之路day02--格式化输出、初始编码、运算符

    格式化输出 格式化输出替换字符串.字符串中%占位符,,%%s就是代表百分号,不代表占位符s 字符串 stringd 数字 dight name = input('请输入你的名字:') age = in ...