uva11297 二维线段树
2015-07-31 09:50
357 查看
询问矩阵内一块矩阵的最值和单点修改。
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<iomanip> #include<map> #include<algorithm> #include<queue> #include<set> #define inf 1000000000 #define pi acos(-1.0) #define eps 1e-8 #define seed 131 using namespace std; typedef pair<int,int> pii; typedef unsigned long long ull; typedef long long ll; const int maxn=100005; int n,Q; int Min[2005][2005]; int Max[2005][2005]; int xo,xleaf; int X1,Y1,X2,Y2,v; int vmax,vmin; int a; void build1D(int l,int r,int rt) { if(l==r) { if(xleaf) { scanf("%d",&a); Max[xo][rt]=Min[xo][rt]=a; } else { Max[xo][rt]=max(Max[xo<<1][rt],Max[xo<<1|1][rt]); Min[xo][rt]=min(Min[xo<<1][rt],Min[xo<<1|1][rt]); } return; } int m=(l+r)/2; build1D(l,m,rt<<1); build1D(m+1,r,rt<<1|1); Max[xo][rt]=max(Max[xo][rt<<1],Max[xo][rt<<1|1]); Min[xo][rt]=min(Min[xo][rt<<1],Min[xo][rt<<1|1]); } void build2D(int l,int r,int rt) { if(l==r) { xo=rt; xleaf=1; build1D(1,n,1); return; } int m=(l+r)/2; build2D(l,m,rt<<1); build2D(m+1,r,rt<<1|1); xo=rt; xleaf=0; build1D(1,n,1); } void query1D(int l,int r,int L,int R,int rt) { if(l<=L&&r>=R) { vmin=min(vmin,Min[xo][rt]); vmax=max(vmax,Max[xo][rt]); return; } int m=(L+R)/2; if(l<=m) { query1D(l,r,L,m,rt<<1); } if(r>m) { query1D(l,r,m+1,R,rt<<1|1); } } void query2D(int l,int r,int L,int R,int rt) { if(l<=L&&r>=R) { xo=rt; query1D(Y1,Y2,1,n,1); return; } int m=(L+R)/2; if(l<=m) { query2D(l,r,L,m,rt<<1); } if(r>m) { query2D(l,r,m+1,R,rt<<1|1); } } void update1D(int y,int L,int R,int rt) { if(L==y&&R==y) { if(xleaf) { Min[xo][rt]=Max[xo][rt]=v; return; } else { Min[xo][rt]=min(Min[xo<<1][rt],Min[xo<<1|1][rt]); Max[xo][rt]=max(Max[xo<<1][rt],Max[xo<<1|1][rt]); } return; } int m=(L+R)/2; if(y<=m) { update1D(y,L,m,rt<<1); } else { update1D(y,m+1,R,rt<<1|1); } Min[xo][rt]=min(Min[xo][rt<<1],Min[xo][rt<<1|1]); Max[xo][rt]=max(Max[xo][rt<<1],Max[xo][rt<<1|1]); } void update2D(int x,int L,int R,int rt) { if(x==L&&x==R) { xo=rt; xleaf=1; update1D(Y1,1,n,1); return; } int m=(L+R)/2; if(x<=m) { update2D(x,L,m,rt<<1); } else { update2D(x,m+1,R,rt<<1|1); } xo=rt; xleaf=0; update1D(Y1,1,n,1); } int main() { char op[2]; scanf("%d",&n); build2D(1,n,1); scanf("%d",&Q); for(int i=0;i<Q;i++) { scanf("%s",op); if(op[0]=='q') { scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2); vmax=0; vmin=inf; query2D(X1,X2,1,n,1); printf("%d %d\n",vmax,vmin); } else { scanf("%d%d%d",&X1,&Y1,&v); update2D(X1,1,n,1); } } return 0; }
相关文章推荐
- Java图形界面事件监听处理之四种方法
- hdu4044GeoDefense 树形dp+分组背包
- 安卓中文字高亮 且有点击事件
- ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)
- PR
- (转)大数据量高并发的数据库优化与sql优化
- C++常见函数(备忘录)
- Ubuntu出现两个桌面菜单栏
- sql server建库、建表、建约束技巧
- POJ 3352 Road Construction(边双连通分量)
- Leetcode #239 Sliding Window Maximum
- LINUX内核GPIO接口解析
- 经常吹空调皮肤是不是会变黑
- Android Api Demos登顶之路(十二)Presentation
- 根据两点经纬度计算距离
- struts2自定义结果类型
- [转]apache下htaccess不起作用,linux,windows详解
- 月半小夜曲下的畅想--DOCTYPE模式
- RTSP(Real Time Streaming Protocol)实时流协议
- [枚举] 多校联合第四场 hdu328 problem killer