poj1195 Mobile phones 二维线段树入门
二维线段树就是树套树,线段树套线段树。。。
#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 二维线段树入门相关推荐
- 10.25T2 二维线段树
Description 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Ai,j. 校长会定期检查一个p*q的 ...
- BZOJ2877 NOI2012魔幻棋盘(二维线段树)
显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...
- POJ2155二维线段树
题意: 给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=5 ...
- POJ-2155 Matrix 二维线段树 | 树状数组
题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...
- [POJ2155] Matrix(二维线段树,树套树)
题目链接:http://poj.org/problem?id=2155 题意:给一个01矩阵,两个操作,翻转:子矩阵里每一个数都由0变1,1变0. 查询:查询某一点是0还是1. 一直以为二维线段树就是 ...
- HDU1823(二维线段树)
题目:Luck and Love 题意:当操作符为'I'时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值. (100<=H<=200, 0.0& ...
- 【NOI2019】弹跳【二维线段树】【dijkstra】
题意:一个w×hw\times hw×h的二维平面上有nnn个城市,有mmm个弹跳装置,第iii个可以花费tit_iti的时间从城市pip_ipi跳到矩形x∈[l,r],y∈[u,d]x\in [ ...
- 模板:二维线段树(线段树套线段树)
文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...
- 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 ...
最新文章
- 关于RAID与SCSI的一些基本概念(转)
- 美研究揭示大脑如何学习语言
- AJPFX关于StringBuffer类的总结
- 【图像分类】 图像分类中的对抗攻击是怎么回事?
- python 只能将最后一行写入excel_Python 应用 办公自动化之 Excel(上)
- java aio为什么不稳定_烯醇式结构为什么不稳定?
- 玩转DB里的数据—阿里云DMS任务编排之简介和实操
- 【Java从0到架构师】Spring - 复杂对象、Converter
- nginx.conf添加lua.conf配置
- 常量 变量 赋值 c
- Introduction to Computer Networking学习笔记(二十六):HTTP、SPDY
- 伴你装系统系列(上篇):Windows10
- MATLAB生成正弦码表
- 10000亿的暴利:数字化营销今生与未来
- Vue中如何解决跨域问题
- 硬链接和符号链接详解
- android bootload漏洞,一加6手机的Bootloader漏洞可让攻击者控制设备
- JAVA——文件操作(全)
- Raspberry Pi 3B学习笔记
- matlab修复模糊图片论文,图像算法论文,关于运动模糊图像复原算法相关参考文献资料-免费论文范文...
热门文章
- STL 之 list 容器详解
- 爬虫程序,从图片网站或者贴吧爬取图片(含代码)
- node python 速度_为什么python在递归上比node.js慢得多
- IDEA中Project 和 Module的区别
- 007_Vue style样式绑定
- 004_FastDFS分布式添加多个tracker
- 002_jQuery语法
- mysql %用户域_MySQL运维---用户权限及管理
- linux操作系统分析实验—基于mykernel的时间片轮转多道程序实现与分析
- 第七章 oracle的服务启动顺序、认证方式、