题目链接

二维树状数组

 #include<iostream>
 #include<math.h>
 #include<algorithm>
 #include<stdlib.h>
 using namespace std;
 #define ll long long
 #define re(i,n) for(int i=0;i<n;i++)
 ;
 int c[maxn][maxn];
 int n, q;
 int lowbit(int x){
     return x&(-x);
 }
 void update(int x, int y){
     ; i-=lowbit(i))
         ; j -= lowbit(j))
             c[i][j] ^= ;
 }
 int query(int x, int y){
     ;
     for (int i = x; i <= n; i+=lowbit(i))
     for (int j = y; j <= n; j += lowbit(j)){
         ans ^= c[i][j];
     }
     return ans;
 }
 int main(){
     //freopen("in.txt", "r", stdin);
     int T; cin >> T;
     while (T--){
         scanf("%d%d", &n, &q);
         memset(c, , sizeof(c));
         while (q--){
             ]; scanf("%s", op);
             ] == 'Q'){
                 int x, y; scanf("%d%d", &x, &y);
                 printf("%d\n", query(x, y));
             }
             else{
                 int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &fy, &tx, &ty);
                 if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty);
                 fx--, fy--;
                 update(fx, fy);
                 update(tx, ty);
                 update(fx, ty);
                 update(tx, fy);
             }
         }
         puts("");
     }
     ;
 }

二维线段树

 #include<iostream>
 #include<stdio.h>
 #include<string.h>
 using namespace std;
 #define ll long long
 #define re(i,n) for(int i=0;i<n;i++)
 #define ls(x) x<<1,f,mid
 #define rs(x) x<<1|1,mid+1,t
 ;
 int n, q;
 int fx, fy, tx, ty, x, y;
 int ans;
 ][maxn << ];
 void updatey(int i, int j, int f, int t){
     if (fy <= f&&ty >= t){
         a[i][j] ^= ;
         return;
     }
     ;
     if (fy <= mid)updatey(i,ls(j));
     if (ty > mid)updatey(i, rs(j));
 }
 void updatex(int i, int f, int t){
     if (fx<=f&&tx>=t){
         updatey(i, , , n);
         return;
     }
     ;
     if (fx <= mid)updatex(ls(i));
     if (tx > mid)updatex(rs(i));
 }
 void queryy(int i, int j, int f, int t){
     ans += a[i][j];
     if (f == t)return;
     ;
     if (y > mid)queryy(i,rs(j));
     else queryy(i, ls(j));
 }
 void queryx(int i, int f, int t){
     queryy(i, , , n);
     if (f == t)return;
     ;
     if (x > mid)queryx(rs(i));
     else queryx(ls(i));
 }
 int main(){
     //freopen("in.txt", "r", stdin);
     int T; cin >> T;
     while (T--){
         scanf("%d%d", &n, &q);
         memset(a, , sizeof(a));
         /*应该用memset,用for循环一定要注意初始化的不是n,而是全部.
         公元2015年9.20日在于此坑.
         re(i, n + 1)re(j, n + 1)a[i][j] = 0;
         */
         while (q--){
             ]; scanf("%s", op);
             ] == 'Q'){
                 scanf("%d%d",&x,&y);
                 ans = ;
                 queryx(, , n);
                 printf();
             }
             else{
                 scanf("%d%d%d%d", &fx, &fy, &tx, &ty);
                 if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty);
                 updatex(,,n);
                 //debug();
             }
         }
         if (T)puts("");
     }
     ;
 }

zkw二维线段树 开区间写法

 #include<iostream>
 #include<stdio.h>
 #include<algorithm>
 using namespace std;
 ;
 typedef long long ll;
 #define re(i,n) for(int i=0;i<n;i++)
 ][maxn << ];
 int n, q,sz;
 bool yquery(int x, int y){
     y += sz;
     ;
     /*
     因为1是哨兵节点,1必然始终都为0,不曾变化,所以算上1也无妨
     */
     while (y){
         ans ^= tr[x][y];
         y >>= ;
     }
     return ans;
 }
 bool query(int x,int y){
     x += sz;
     ;
     while (x){
         ans ^= yquery(x, y);
         x >>= ;
     }
     return ans;
 }
 void yupdate(int x, int fy, int ty){
     fy += sz - , ty += sz + ;
     ){
         )tr[x][fy ^ ] ^= ;
         )tr[x][ty ^ ] ^= ;
         fy >>= , ty >>= ;
     }
 }
 void update(int fx,int fy,int tx,int ty){
     fx += sz - , tx += sz + ;
     ){
         )yupdate(fx^, fy, ty);
         )yupdate(tx ^ , fy, ty);
         fx >>= , tx >>= ;
     }
 }
 int main(){
     //freopen("in.txt", "r", stdin);
     int T; cin >> T;
     while (T--){
         scanf("%d%d", &n, &q);
         sz = ; )sz <<= ;
         memset(tr, , sizeof(tr));
         while (q--){
             ]; scanf("%s", op);
             ] == 'Q'){
                 int x, y; scanf("%d%d", &x, &y);
                 bool ans = query(x, y);
                 printf("%d\n", ans);
             }
             else{
                 int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &fy, &tx, &ty);
                 if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty);
                 update(fx, fy, tx, ty);
             }
         }
         puts("");
     }
     ;
 }

zwk二维线段树闭区间写法

 #include<iostream>
 #include<stdio.h>
 #include<algorithm>
 using namespace std;
 ;
 typedef long long ll;
 #define re(i,n) for(int i=0;i<n;i++)
 ][maxn << ];
 int n, q,sz;
 bool yquery(int x, int y){
     y += sz-;
     ;
     /*
     因为1是哨兵节点,1必然始终都为0,不曾变化,所以算上1也无妨
     */
     while (y){
         ans ^= tr[x][y];
         y >>= ;
     }
     return ans;
 }
 bool query(int x,int y){
     x += sz-;
     ;
     while (x){
         ans ^= yquery(x, y);
         x >>= ;
     }
     return ans;
 }
 /*
 开区间=闭区间-两个端点.
 所以,先处理两个端点之后就变成了开区间.
 两个端点处理时要加上一个判断,l==r,如果相等,那就不能对同一个点处理两次,只处理一个点然后返回就行了;如果不等,那就先处理两端,再按照开区间的方式进行处理.
 */
 void yupdate(int x, int fy, int ty){
     fy += sz - , ty += sz -;
     ; return; }
     tr[x][fy] ^= , tr[x][ty] ^= ;
     ){
         )tr[x][fy ^ ] ^= ;
         )tr[x][ty ^ ] ^= ;
         fy >>= , ty >>= ;
     }
 }
 void update(int fx,int fy,int tx,int ty){
     fx += sz - , tx += sz - ;
     if (fx == tx){
         yupdate(fx, fy, ty); return;
     }
     yupdate(fx, fy, ty), yupdate(tx, fy, ty);
     ){
         )yupdate(fx^, fy, ty);
         )yupdate(tx ^ , fy, ty);
         fx >>= , tx >>= ;
     }
 }
 int main(){
     freopen("in.txt", "r", stdin);
     int T; cin >> T;
     while (T--){
         scanf("%d%d", &n, &q);
         sz = ; ;
         memset(tr, , sizeof(tr));
         while (q--){
             ]; scanf("%s", op);
             ] == 'Q'){
                 int x, y; scanf("%d%d", &x, &y);
                 bool ans = query(x, y);
                 printf("%d\n", ans);
             }
             else{
                 int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &fy, &tx, &ty);
                 if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty);
                 update(fx, fy, tx, ty);
             }
         }
         putchar();//换行是10,回车13,空格32
     }
     ;
 }

POJ2155 Matrix二维线段树经典题的更多相关文章

  1. POJ2155 Matrix 二维线段树

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

  2. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

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

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

  4. POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询

    本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样, ...

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

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

  6. Mosaic HDU 4819 二维线段树入门题

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  7. poj 2155 matrix 二维线段树

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

  8. POJ2155 Matrix 【二维线段树】

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

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

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

随机推荐

  1. Sybase PowerDesign 导入数据库结构formSqlserver

    采用Sybase PD 创建数据库设计是常见的方法,如果遇到链接数据源时,无法直接链接系统数据源,而且在Sybase PD中无法直接创建odbc数据源时, 可以到控制面板中创建数据源,一步步的网络上有 ...

  2. 网友转发的很全的 LISTCTL 控件使用的说明

    作者:lixiaosan 时间:04/06/2006 以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 "ListV ...

  3. CleanBlog(个人博客+源码)

    CleanBlog是一个高端(低调).大气(简洁)的个人博客系统,之前在网上看到了好多个人博客网站,感觉很酷的,自己也想搭建一个,最近 刚学完SSM(Spring/SpringMVC/MyBatis) ...

  4. USACO1.2Milking Cows

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  5. 第66课 C++中的类型识别

    1. 类型识别 (1)在面向对象中可能出现下面的情况 ①基类指针指向子类对象 ②基类引用成为子类对象的别名 ▲静态类型——变量(对象)自身的类型(定义变量类型时类型或参数类型) ▲动态类型——指针(引 ...

  6. PHP 文章实现内链

    下面说说我初步实现的方法: 1.用程序批量生成关键词和链接对应的库或手动添加关键词和链接库(库可以用数组的格式以文件的形式存储) 2.在view页面输出内容时执行查找替换的操作.上代码吧 <?p ...

  7. JMeter学习(十七)JMeter测试Java

    目的:对Java程序进行测试 目录 一.核心步骤 二.实例 三.JMeter Java Sampler介绍 四.自带Java Request Sampler 一.核心步骤 1.创建一个Java工程: ...

  8. noip模拟赛(10.4) 背包(pack)

    [题目描述] 蛤布斯有n种商品,第i种物品的价格为ai,价值为bi.有m个人来向蛤布斯购买商品,每个人每种物品只能购买一个.第j个人有cj的钱,他会不停选择一个能买得起的价格最高的商品买走(如果有多个 ...

  9. HTML 学习笔记(表格)

    HTML 表格 HTML中的表格使用标签<table>来实现,每个表格均有若干行由<tr>标签来定义,每个<tr>表示一行.美航被分为若干个单元格用<td&g ...

  10. tomcat安装配置.md

    tomcat 安装 安装jdk jdk我使用的是oracle的,如果下载请在oracle的官网上下载.或者你也可以使用openjdk,官网在http://openjdk.java.net/. # ta ...