题意

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

题解

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

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

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

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

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

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

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

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<string.h>
  5. #define endl '\n'
  6. #define ll long long
  7. #define ull unsigned long long
  8. #define fi first
  9. #define se second
  10. #define mp make_pair
  11. #define pii pair<int,int>
  12. #define all(x) x.begin(),x.end()
  13. #define IO ios::sync_with_stdio(false)
  14. #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
  15. #define per(ii,a,b) for(int ii=b;ii>=a;--ii)
  16. #define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
  17. using namespace std;
  18. const int maxn=4e3+10,maxm=2e6+10;
  19. const ll INF=0x3f3f3f3f3f3f3f3f;
  20. const int mod=1e9+7;
  21. int casn,n,m,k,d;
  22. class sstree{
  23. #define nd node[nowx][nowy]
  24. public:
  25. struct segnode {int val;};
  26. // vector<vector<segnode> > node;
  27. int n,m,x1,x2,y1,y2,x,nowx;
  28. int ans;
  29. segnode node[maxn][maxn];
  30. void init(int nn,int mm) {
  31. n=nn,m=mm;
  32. memset(node ,0,sizeof node);
  33. // node.resize(n*4+10);
  34. // rep(i,0,(n*4+9)) node[i].resize(m*4+10);
  35. }
  36. void update(int xx1,int xx2,int yy1,int yy2){
  37. x1=xx1,y1=yy1,x2=xx2,y2=yy2;
  38. updatex(1,n);
  39. }
  40. void updatey(int l,int r,int nowy=1){
  41. if(y1>r||y2<l) return ;
  42. if(y1<=l&&y2>=r){nd.val^=1;return ;}
  43. updatey(l,(l+r)>>1,nowy<<1); updatey(((l+r)>>1)+1,r,nowy<<1|1);
  44. }
  45. void updatex(int l,int r,int now=1){
  46. if(x1>r||x2<l) return ;
  47. if(x1<=l&&x2>=r) {nowx=now;updatey(1,m);return ;}
  48. updatex(l,(l+r)>>1,now<<1); updatex(((l+r)>>1)+1,r,now<<1|1);
  49. }
  50. int query(int xx,int yy){
  51. x1=xx,y1=yy;ans=0;
  52. queryx(1,n);
  53. return ans;
  54. }
  55. void queryy(int l,int r,int nowy=1){
  56. if(y1>r||y1<l) return ;
  57. ans^=nd.val;
  58. if(l==r) return ;
  59. queryy(l,(l+r)>>1,nowy<<1);queryy(((l+r)>>1)+1,r,nowy<<1|1);
  60. }
  61. void queryx(int l,int r,int now=1){
  62. if(x1>r||x1<l) return ;
  63. nowx=now;queryy(1,m);
  64. if(l==r) return ;
  65. queryx(l,(l+r)>>1,now<<1);queryx(((l+r)>>1)+1,r,now<<1|1);
  66. }
  67. }tree;
  68. int main() {
  69. IO;
  70. cin>>casn;
  71. register int a,b,c,d;
  72. string s;
  73. while(casn--){
  74. cin>>n>>m;
  75. tree.init(n,n);
  76. while(m--){
  77. cin>>s;
  78. if(s[0]=='C') {
  79. cin>>a>>b>>c>>d;
  80. tree.update(a,c,b,d);
  81. }else {
  82. cin>>a>>b;
  83. cout<<tree.query(a,b)<<endl;
  84. }
  85. }
  86. if(casn) cout<<endl;
  87. }
  88. }

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. 四:OVS+GRE之网络节点

    关于Neutron上的三种Agent的作用: Neutron-OVS-Agent:从OVS-Plugin上接收tunnel和tunnel flow的配置,驱动OVS来建立GRE Tunnel Neut ...

  2. vue webpack打包

    webpack构建流程 从启动webpack构建到输出结果经历了一系列过程,它们是: 解析webpack配置参数,合并从shell传入和webpack.config.js文件里配置的参数,生产最后的配 ...

  3. H5网页后在返回到微信公众平台自定义菜单

    <p class="success">订阅成功!</p> <div class="btn" @click="finish ...

  4. es6可变参数-扩展运算符

    es5中参数不确定个数的情况下: //求参数和 function f(){ var a = Array.prototype.slice.call(arguments); var sum = 0; a. ...

  5. 控制结构(2): 卫语句(guard clause)

    // 上一篇:分枝/叶子(branch/leaf) // 下一篇:状态机(state machine) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 典型代码: 同步版本 f ...

  6. Cnario 3.8支持哪些操作系统?

    Cnario是基于Windows平台开发的软件,包含Server.Messenger和Player三个组件,支持以下Windows 版本系统: Server/Messenger 支持英文版的以下操作系 ...

  7. iView组件添加API中介绍的事件的方式(render方式添加事件)

    iView组件好用,文档齐全,品质可靠稳定.最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件.给作者点个赞.用这个组件来学习Vue.js也是不错的选择. 最近用的比 ...

  8. 设置 sql_mode

    MySQL 的 sql_mode 合理设置 sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模 ...

  9. 洛谷 P3327 【[SDOI2015]约数个数和】

    前置芝士 关于这个题,你必须知道一个这样奇奇怪怪的式子啊QAQ \[d(i*j)= \sum_{x|i} \sum_{y|j}[gcd(x,y)=1] \] 留坑,先感性理解:后面那个gcd是为了去重 ...

  10. 自古枪兵幸运E

    好梗 求方程的解.n个可以奇数可以偶数,m个必须是偶数 两种方法: 都是O(nlogn)logn是LUCAS定理 法一: 有奇数有偶数,如果都是偶数,那么可以直接除以二然后组合数学 所以枚举有几个奇数 ...