UVA 11992 Fast Matrix Operations
2014-08-06 11:52
483 查看
线段树
#include <iostream> using namespace std; const int maxn = 1000005; const int INF = 1000000009; struct node { int sum,ma,mi; int addv,setv; void init (int nsum,int nma,int nmi,int naddv,int nsetv){ sum=nsum;ma=nma;mi=nmi; addv=naddv;setv=nsetv; } }tree[30][maxn*2]; int r,c,m; void init (){ for (int i=1;i<=r;i++){ for (int j=1;j<=c*2;j++){ tree[i][j].init (0,0,0,0,-1); } tree[i][1].setv=0; } } //int sum[30][maxn],ma[30][maxn],mi[30][maxn]; //int addv[30][maxn],setv[30][maxn]; void maintain (int o,int l,int r,int i){ int lc=o<<1,rc=(o<<1)+1; if (r>l){ tree[i][o].sum=tree[i][lc].sum+tree[i][rc].sum; tree[i][o].mi=min (tree[i][lc].mi,tree[i][rc].mi); tree[i][o].ma=max (tree[i][lc].ma,tree[i][rc].ma); } if (tree[i][o].setv!=-1){ tree[i][o].mi=tree[i][o].setv; tree[i][o].ma=tree[i][o].setv; tree[i][o].sum=tree[i][o].setv*(r-l+1); } if (tree[i][o].addv){ tree[i][o].mi+=tree[i][o].addv; tree[i][o].ma+=tree[i][o].addv; tree[i][o].sum+=tree[i][o].addv*(r-l+1); } } void pushdown (int o,int i){ int lc=o<<1,rc=(o<<1)+1; if (tree[i][o].setv!=-1){ tree[i][lc].setv=tree[i][rc].setv=tree[i][o].setv; tree[i][lc].addv=tree[i][rc].addv=0; tree[i][o].setv=-1; } if (tree[i][o].addv>0){ tree[i][lc].addv+=tree[i][o].addv; tree[i][rc].addv+=tree[i][o].addv; tree[i][o].addv=0; } } void add (int o,int l,int r,int x1,int x2,int i,int v){ int m=l+(r-l)/2,lc=o<<1,rc=(o<<1)+1; if (x1<=l&&r<=x2){ tree[i][o].addv+=v; } else { pushdown (o,i); if (x1<=m) add (lc,l,m,x1,x2,i,v);else maintain (lc,l,m,i); if (m<x2) add (rc,m+1,r,x1,x2,i,v);else maintain (rc,m+1,r,i); } maintain (o,l,r,i); return ; } void set (int o,int l,int r,int x1,int x2,int i,int v){ int m=l+(r-l)/2; int lc=o<<1,rc=(o<<1)+1; if (x1<=l&&r<=x2){ tree[i][o].setv=v; tree[i][o].addv=0; } else { pushdown (o,i); if (x1<=m) set (lc,l,m,x1,x2,i,v);else maintain (lc,l,m,i); if (m<x2) set (rc,m+1,r,x1,x2,i,v);else maintain (rc,m+1,r,i); } maintain (o,l,r,i); return ; } int sum,ma,mi; int query (int o,int l,int r,int x1,int x2,int i,int addv){ int m=l+(r-l)/2,lc=o<<1,rc=(o<<1)+1; if (tree[i][o].setv!=-1){ int x=tree[i][o].setv+addv+tree[i][o].addv; sum+=x*(min(r,x2)-max(l,x1)+1); mi=min (mi,x); ma=max (ma,x); addv=0; } else if (x1<=l&&r<=x2){ sum+=tree[i][o].sum+addv*(r-l+1); mi=min (mi,tree[i][o].mi+addv); ma=max (ma,tree[i][o].ma+addv); } else { if (x1<=m) query (lc,l,m,x1,x2,i,addv+tree[i][o].addv); if (x2>m) query (rc,m+1,r,x1,x2,i,addv+tree[i][o].addv); } } int main (){ while (cin>>r>>c>>m){ init (); while (m--){ int f,x1,x2,y1,y2,v; cin>>f>>x1>>y1>>x2>>y2; if (f==1){ cin>>v; for (int i=x1;i<=x2;i++) add (1,1,c,y1,y2,i,v); } else if (f==2){ cin>>v; for (int i=x1;i<=x2;i++) set (1,1,c,y1,y2,i,v); } else if (f==3){ sum=0;ma=-INF;mi=INF; for (int i=x1;i<=x2;i++) query (1,1,c,y1,y2,i,0); cout<<sum<<" "<<mi<<" "<<ma<<endl; } } } return 0; }
相关文章推荐
- Uva 11992 Fast Matrix Operations
- Uva-11992-Fast Matrix Operations
- 【UVA11992】Fast Matrix Operations——二维线段树
- UVa 11992 (线段树 区间修改) Fast Matrix Operations
- Fast Matrix Operations ,uva 11992
- uva 11992 Fast Matrix Operations
- 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations
- UVA 11992 Fast Matrix Operations
- UVA 11992 - Fast Matrix Operations
- UVa 11992 Fast Matrix Operations / 线段树成段更新
- UVA - 11992:Fast Matrix Operations
- uva11992 Fast Matrix Operations
- 【UVa】11992 Fast Matrix Operations
- UVA 11992 Fast Matrix Operations
- UVA 11992 Fast Matrix Operations
- Fast Matrix Operations(UVA)11992
- uva11992 Fast Matrix Operations
- UVA 11192 Fast Matrix Operations
- 11992 - Fast Matrix Operations
- UVA 11992 Fast Matrix Operation(线段树,多个线段树)