二维线段树(Mosaic,hdu 4819)
来源:互联网 发布:linux shell cut 编辑:程序博客网 时间:2024/05/16 10:04
参考代码:http://www.cnblogs.com/Wine93/p/3515756.html
就是裸的二维线段树
代码
#include<bits/stdc++.h>#define maxn 850using namespace std;int n;int Q,x,y,l;int xl,xr,yl,yr;int ansmin,ansmax,ans;int a[maxn][maxn];int MIN[maxn<<2][maxn<<2];int MAX[maxn<<2][maxn<<2];void PushUpY(int xnow,int ynow){ MIN[xnow][ynow]=min(MIN[xnow][ynow<<1],MIN[xnow][ynow<<1|1]); MAX[xnow][ynow]=max(MAX[xnow][ynow<<1],MAX[xnow][ynow<<1|1]);}void PushUpX(int xnow,int ynow){ MIN[xnow][ynow]=min(MIN[xnow<<1][ynow],MIN[xnow<<1|1][ynow]); MAX[xnow][ynow]=max(MAX[xnow<<1][ynow],MAX[xnow<<1|1][ynow]);}void BUILDY(int xnow,int x,int key,int l,int r,int now){ if(l==r) { if(key) MIN[xnow][now]=MAX[xnow][now]=a[x][l]; else PushUpX(xnow,now); return; } int m=l+(r-l)/2; BUILDY(xnow,x,key,l,m,now<<1); BUILDY(xnow,x,key,m+1,r,now<<1|1); PushUpY(xnow,now);}void BUILDX(int l,int r,int now){ if(l==r) { BUILDY(now,l,1,1,n,1); return; } int m=l+(r-l)/2; BUILDX(l,m,now<<1); BUILDX(m+1,r,now<<1|1); BUILDY(now,l,0,1,n,1);}void QueryY(int xnow,int l,int r,int now){ if(yl<=l&&r<=yr) { ansmax=max(ansmax,MAX[xnow][now]); ansmin=min(ansmin,MIN[xnow][now]); return; } int m=l+(r-l)/2; if(yl<=m) QueryY(xnow,l,m,now<<1); if(yr>m) QueryY(xnow,m+1,r,now<<1|1);}void QueryX(int l,int r,int now){ if(xl<=l&&r<=xr) { QueryY(now,1,n,1); return; } int m=l+(r-l)/2; if(xl<=m) QueryX(l,m,now<<1); if(xr>m) QueryX(m+1,r,now<<1|1);}void UpDataY(int xnow,int key,int l,int r,int now){ if(l==r) { if(key) MAX[xnow][now]=MIN[xnow][now]=a[x][y]=ans; else PushUpX(xnow,now); return; } int m=l+(r-l)/2; if(y<=m) UpDataY(xnow,key,l,m,now<<1); else UpDataY(xnow,key,m+1,r,now<<1|1); PushUpY(xnow,now);}void UpDataX(int l,int r,int now){ if(l==r) { UpDataY(now,1,1,n,1); return; } int m=l+(r-l)/2; if(x<=m) UpDataX(l,m,now<<1); else UpDataX(m+1,r,now<<1|1); UpDataY(now,0,1,n,1);}int main(){ int T; scanf("%d",&T); for(int t=1;t<=T;t++) { printf("Case #%d:\n",t); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); BUILDX(1,n,1); scanf("%d",&Q); while(Q--) { scanf("%d %d %d",&x,&y,&l); l/=2; xl=max(1,x-l);xr=min(n,x+l); yl=max(1,y-l);yr=min(n,y+l); ansmin=INT_MAX; ansmax=INT_MIN; QueryX(1,n,1); ans=(ansmin+ansmax)/2; printf("%d\n",ans); UpDataX(1,n,1); } } return 0;}
0 0
- HDU 4819 Mosaic (二维线段树)
- HDU 4819 Mosaic(二维线段树)
- 二维线段树(Mosaic,hdu 4819)
- HDU 4819 Mosaic (二维线段树)
- HDU 4819 Mosaic (二维线段树)
- hdu 4819 Mosaic (二维线段树)
- HDU-4819-Mosaic(二维线段树)
- HDU 4819 Mosaic 二维线段树
- HDU 4819 Mosaic(二维线段树)
- HDU 4819 Mosaic 二维线段树
- hdu 4819 Mosaic【二维线段树】
- HDU 4819 Mosaic 二维线段树
- hdu 4819 Mosaic(二维线段树)
- HDU 4819 Mosaic 二维线段树
- HDU 4819 Mosaic 二维线段树
- HDU 4819 Mosaic --二维线段树(树套树)
- 【HDU 4819】Mosaic 二维线段树模板
- 【二维线段树】hdu 4819 Mosaic
- 结构体基础知识
- Http - 方法定义
- ZCMU—1131
- 线程通信(生产者消费者问题)、wait()与notify()方法详解
- 约瑟夫生死问题递归算法
- 二维线段树(Mosaic,hdu 4819)
- java的锁机制
- 微信订阅号和服务号再探究竟
- Atitit View事件分发机制
- Android实现计时与倒计时(限时抢购)的几种方法
- Qt之进程间通信(共享内存)
- 有关 poi 读 excel 中的一些问题
- 合并文档时让第一页为奇数
- div设置float后下一个div要换行的解决办法