二维线段树就是树套树,线段树套线段树。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1using namespace std;typedef long long ll;
const int maxn=1500;
const int INF=1e9+10;int n;
int op;
int x,y,z;
int xt1,yt1,xt2,yt2;
struct NodeY
{int l,r;int cnt;
};
struct NodeX
{int l,r;int cnt;NodeY ty[maxn<<2];void up(int rt){ty[rt].cnt=ty[rt<<1].cnt+ty[rt<<1|1].cnt;}void build(int l,int r,int rt){ty[rt].l=l;ty[rt].r=r;ty[rt].cnt=0;if(l==r) return;int m=(l+r)>>1;build(lson);build(rson);up(rt);}void update(int p,int c,int l,int r,int rt){if(l==r){ty[rt].cnt+=c;return;}int m=(l+r)>>1;if(p<=m) update(p,c,lson);else update(p,c,rson);up(rt);}int query(int L,int R,int l,int r,int rt){if(L<=l&&r<=R) return ty[rt].cnt;int m=(l+r)>>1;int res=0;if(L<=m) res+=query(L,R,lson);if(R>m) res+=query(L,R,rson);return res;}
};NodeX tx[maxn<<2];void up(int rt)
{tx[rt].cnt=tx[rt<<1].cnt+tx[rt<<1|1].cnt;
}void build(int l,int r,int rt)
{tx[rt].l=l;tx[rt].r=r;tx[rt].cnt=0;tx[rt].build(1,n,1);if(l==r) return;int m=(l+r)>>1;build(lson);build(rson);up(rt);
}void update(int x,int y,int c,int l,int r,int rt)
{tx[rt].update(y,c,1,n,1);if(l==r) return;int m=(l+r)>>1;if(x<=m) update(x,y,c,lson);else update(x,y,c,rson);up(rt);
}int query(int xL,int xR,int yL,int yR,int l,int r,int rt)
{if(xL<=l&&r<=xR) return tx[rt].query(yL,yR,1,n,1);int m=(l+r)>>1;int res=0;if(xL<=m) res+=query(xL,xR,yL,yR,lson);if(xR>m) res+=query(xL,xR,yL,yR,rson);return res;
}int main()
{freopen("in.txt","r",stdin);scanf("%d%d",&op,&n);build(1,n,1);while(~scanf("%d",&op)&&op!=3){if(op==1){scanf("%d%d%d",&x,&y,&z);x++;y++;update(x,y,z,1,n,1);}else{scanf("%d%d%d%d",&xt1,&yt1,&xt2,&yt2);xt1++;yt1++;xt2++;yt2++;printf("%d\n",query(xt1,xt2,yt1,yt2,1,n,1));}}return 0;
}

View Code

-----更新

上面那个是利用了求和以及更新增减的特殊性,下面这个才是更实用的普遍做法。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1using namespace std;typedef long long ll;
const int maxn=1500;
const int INF=1e9+10;int op,n;
int x,y,a;
int xt,yt;
int tr[maxn<<2][maxn<<2];void upy(int rt,int rtx)
{tr[rtx][rt]=tr[rtx][rt<<1]+tr[rtx][rt<<1|1];
}void buildy(int l,int r,int rt,int rtx)
{if(l==r){tr[rtx][rt]=0;return;}int m=(l+r)>>1;buildy(lson,rtx);buildy(rson,rtx);upy(rt,rtx);
}void updatey(int p,int c,int l,int r,int rt,int rtx)
{if(l==r){tr[rtx][rt]+=c;return;}int m=(l+r)>>1;if(p<=m) updatey(p,c,lson,rtx);else updatey(p,c,rson,rtx);upy(rt,rtx);
}int queryy(int L,int R,int l,int r,int rt,int rtx)
{if(L<=l&&r<=R) return tr[rtx][rt];int m=(l+r)>>1;int res=0;if(L<=m) res+=queryy(L,R,lson,rtx);if(R>m) res+=queryy(L,R,rson,rtx);return res;
}void buildx(int l,int r,int rt)
{buildy(1,n,1,rt);if(l==r) return;int m=(l+r)>>1;buildx(lson);buildx(rson);
}void upx(int p,int rtx,int l,int r,int rt)
{tr[rtx][rt]=tr[rtx<<1][rt]+tr[rtx<<1|1][rt];if(l==r) return;int m=(l+r)>>1;if(p<=m) upx(p,rtx,lson);else upx(p,rtx,rson);
}void updatex(int x,int y,int c,int l,int r,int rt)
{if(l==r){updatey(y,c,1,n,1,rt);return;}int m=(l+r)>>1;if(x<=m) updatex(x,y,c,lson);else updatex(x,y,c,rson);upx(y,rt,1,n,1);
}int queryx(int xL,int xR,int yL,int yR,int l,int r,int rt)
{if(xL<=l&&r<=xR) return queryy(yL,yR,1,n,1,rt);int m=(l+r)>>1;int res=0;if(xL<=m) res+=queryx(xL,xR,yL,yR,lson);if(xR>m) res+=queryx(xL,xR,yL,yR,rson);return res;
}int main()
{freopen("in.txt","r",stdin);scanf("%d%d",&op,&n);buildx(1,n,1);while(~scanf("%d",&op)&&op!=3){if(op==1){scanf("%d%d%d",&x,&y,&a);x++;y++;updatex(x,y,a,1,n,1);}else{scanf("%d%d%d%d",&x,&y,&xt,&yt);x++;y++;xt++;yt++;printf("%d\n",queryx(x,xt,y,yt,1,n,1));}}return 0;
}

View Code

转载于:https://www.cnblogs.com/--560/p/5243587.html

poj1195 Mobile phones 二维线段树入门相关推荐

  1. 10.25T2 二维线段树

    Description 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Ai,j. 校长会定期检查一个p*q的 ...

  2. BZOJ2877 NOI2012魔幻棋盘(二维线段树)

    显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...

  3. POJ2155二维线段树

    题意:      给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=5 ...

  4. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

  5. [POJ2155] Matrix(二维线段树,树套树)

    题目链接:http://poj.org/problem?id=2155 题意:给一个01矩阵,两个操作,翻转:子矩阵里每一个数都由0变1,1变0. 查询:查询某一点是0还是1. 一直以为二维线段树就是 ...

  6. HDU1823(二维线段树)

    题目:Luck and Love 题意:当操作符为'I'时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值. (100<=H<=200, 0.0& ...

  7. 【NOI2019】弹跳【二维线段树】【dijkstra】

    题意:一个w×hw\times hw×h的二维平面上有nnn个城市,有mmm个弹跳装置,第iii个可以花费tit_iti​的时间从城市pip_ipi​跳到矩形x∈[l,r],y∈[u,d]x\in [ ...

  8. 模板:二维线段树(线段树套线段树)

    文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...

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

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

最新文章

  1. 关于RAID与SCSI的一些基本概念(转)
  2. 美研究揭示大脑如何学习语言
  3. AJPFX关于StringBuffer类的总结
  4. 【图像分类】 图像分类中的对抗攻击是怎么回事?
  5. python 只能将最后一行写入excel_Python 应用 办公自动化之 Excel(上)
  6. java aio为什么不稳定_烯醇式结构为什么不稳定?
  7. 玩转DB里的数据—阿里云DMS任务编排之简介和实操
  8. 【Java从0到架构师】Spring - 复杂对象、Converter
  9. nginx.conf添加lua.conf配置
  10. 常量 变量 赋值 c
  11. Introduction to Computer Networking学习笔记(二十六):HTTP、SPDY
  12. 伴你装系统系列(上篇):Windows10
  13. MATLAB生成正弦码表
  14. 10000亿的暴利:数字化营销今生与未来
  15. Vue中如何解决跨域问题
  16. 硬链接和符号链接详解
  17. android bootload漏洞,一加6手机的Bootloader漏洞可让攻击者控制设备
  18. JAVA——文件操作(全)
  19. Raspberry Pi 3B学习笔记
  20. matlab修复模糊图片论文,图像算法论文,关于运动模糊图像复原算法相关参考文献资料-免费论文范文...

热门文章

  1. STL 之 list 容器详解
  2. 爬虫程序,从图片网站或者贴吧爬取图片(含代码)
  3. node python 速度_为什么python在递归上比node.js慢得多
  4. IDEA中Project 和 Module的区别
  5. 007_Vue style样式绑定
  6. 004_FastDFS分布式添加多个tracker
  7. 002_jQuery语法
  8. mysql %用户域_MySQL运维---用户权限及管理
  9. linux操作系统分析实验—基于mykernel的时间片轮转多道程序实现与分析
  10. 第七章 oracle的服务启动顺序、认证方式、