1. 程式人生 > >Fast Matrix Operations

Fast Matrix Operations

can inline 三種 print urn 有一個 ret void col

有一個r行c列的全0矩陣,有以下三種操作。

  • 1 X1 Y1 X2 Y2 v 子矩陣(X1,Y1,X2,Y2)的元素加v

  • 2 X1 Y1 X2 Y2 v 子矩陣(X1,Y1,X2,Y2)的元素變為v

  • 3 X1 Y1 X2 Y2 查詢子矩陣(X1,Y1,X2,Y2)的和,最大值,最小值

子矩陣(X1,Y1,X2,Y2)滿足X1<=X<=X2 Y1<=Y<=Y2的所有元素(X1,Y2)。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4
#include<algorithm> 5 using namespace std; 6 const int maxn=1e7+9; 7 int tree[30],r,c,m,T; 8 int mi[maxn],ma[maxn],sum[maxn],lson[maxn],rson[maxn],tag[maxn],st[maxn]; 9 inline int max(int a,int b){return a>b?a:b;} 10 inline int min(int a,int b){return a<b?a:b;} 11 inline void pushup(int
rt) 12 { 13 ma[rt]=max(ma[lson[rt]],ma[rson[rt]]); 14 mi[rt]=min(mi[lson[rt]],mi[rson[rt]]); 15 sum[rt]=sum[lson[rt]]+sum[rson[rt]]; 16 } 17 inline void pushdown(int rt,int l,int r) 18 { 19 int mid=(l+r)>>1; 20 if(st[rt]) 21 { 22 st[lson[rt]]=st[rt];
23 st[rson[rt]]=st[rt]; 24 mi[lson[rt]]=st[rt]; 25 ma[lson[rt]]=st[rt]; 26 mi[rson[rt]]=st[rt]; 27 ma[rson[rt]]=st[rt]; 28 sum[lson[rt]]=st[rt]*(mid-l+1); 29 sum[rson[rt]]=st[rt]*(r-mid); 30 tag[lson[rt]]=tag[rson[rt]]=0; 31 st[rt]=0; 32 } 33 if(tag[rt]) 34 { 35 tag[lson[rt]]+=tag[rt]; 36 tag[rson[rt]]+=tag[rt]; 37 mi[lson[rt]]+=tag[rt]; 38 ma[lson[rt]]+=tag[rt]; 39 mi[rson[rt]]+=tag[rt]; 40 ma[rson[rt]]+=tag[rt]; 41 sum[lson[rt]]+=tag[rt]*(mid-l+1); 42 sum[rson[rt]]+=tag[rt]*(r-mid); 43 tag[rt]=0; 44 } 45 } 46 inline int build(int l,int r) 47 { 48 int rt=++T; 49 tag[rt]=sum[rt]=mi[rt]=ma[rt]=st[rt]=0; 50 if(l==r) 51 { 52 sum[rt]=mi[rt]=ma[rt]=0; 53 lson[rt]=rson[rt]=0; 54 return rt; 55 } 56 int mid=(l+r)>>1; 57 lson[rt]=build(l,mid); 58 rson[rt]=build(mid+1,r); 59 pushup(rt); 60 return rt; 61 } 62 inline void add(int rt,int l,int r,int ll,int rr,int w) 63 { 64 if(ll<=l&&rr>=r) 65 { 66 tag[rt]+=w; 67 sum[rt]+=w*(r-l+1); 68 mi[rt]+=w; 69 ma[rt]+=w; 70 return ; 71 } 72 pushdown(rt,l,r); 73 int mid=(l+r)>>1; 74 if(ll<=mid) add(lson[rt],l,mid,ll,rr,w); 75 if(mid<rr) add(rson[rt],mid+1,r,ll,rr,w); 76 pushup(rt); 77 } 78 inline void set(int rt,int l,int r,int ll,int rr,int w) 79 { 80 if(ll<=l&&rr>=r) 81 { 82 sum[rt]=(r-l+1)*w; 83 tag[rt]=0; 84 ma[rt]=w; 85 mi[rt]=w; 86 st[rt]=w; 87 return ; 88 } 89 pushdown(rt,l,r); 90 int mid=(l+r)>>1; 91 if(ll<=mid) set(lson[rt],l,mid,ll,rr,w); 92 if(mid<rr) set(rson[rt],mid+1,r,ll,rr,w); 93 pushup(rt); 94 } 95 inline int all_query(int rt,int l,int r,int ll,int rr) 96 { 97 if(ll<=l&&rr>=r) 98 return sum[rt]; 99 pushdown(rt,l,r); 100 int mid=(l+r)>>1; 101 int ans=0; 102 if(ll<=mid) ans+=all_query(lson[rt],l,mid,ll,rr); 103 if(rr>mid) ans+=all_query(rson[rt],mid+1,r,ll,rr); 104 return ans; 105 } 106 inline int max_query(int rt,int l,int r,int ll,int rr) 107 { 108 if(ll<=l&&rr>=r) 109 return ma[rt]; 110 pushdown(rt,l,r); 111 int mid=(l+r)>>1; 112 int ans=-0x3f3f3f3f; 113 if(ll<=mid) ans=max(ans,max_query(lson[rt],l,mid,ll,rr)); 114 if(rr>mid) ans=max(ans,max_query(rson[rt],mid+1,r,ll,rr)); 115 return ans; 116 } 117 inline int min_query(int rt,int l,int r,int ll,int rr) 118 { 119 if(ll<=l&&rr>=r) 120 return mi[rt]; 121 pushdown(rt,l,r); 122 int mid=(l+r)>>1; 123 int ans=0x3f3f3f3f; 124 if(ll<=mid) ans=min(ans,min_query(lson[rt],l,mid,ll,rr)); 125 if(rr>mid) ans=min(ans,min_query(rson[rt],mid+1,r,ll,rr)); 126 return ans; 127 } 128 int main() 129 { 130 while(~scanf("%d%d%d",&r,&c,&m)) 131 { 132 T=0; 133 for(register int i=1;i<=r;i++) 134 tree[i]=build(1,c); 135 for(register int i=1;i<=m;i++) 136 { 137 int opt,x1,x2,y1,y2; 138 scanf("%d%d%d%d%d",&opt,&x1,&y1,&x2,&y2); 139 if(opt==1) 140 { 141 int v;scanf("%d",&v); 142 for(register int i=x1;i<=x2;i++) 143 add(tree[i],1,c,y1,y2,v); 144 } 145 if(opt==2) 146 { 147 int v;scanf("%d",&v); 148 for(register int i=x1;i<=x2;i++) 149 set(tree[i],1,c,y1,y2,v); 150 } 151 if(opt==3) 152 { 153 int all=0,minn=0x3f3f3f,maxx=-0x3f3f3f; 154 for(register int i=x1;i<=x2;i++) 155 { 156 all+=all_query(tree[i],1,c,y1,y2); 157 minn=min(minn,min_query(tree[i],1,c,y1,y2)); 158 maxx=max(maxx,max_query(tree[i],1,c,y1,y2)); 159 } 160 printf("%d %d %d\n",all,minn,maxx); 161 } 162 } 163 } 164 return 0; 165 }

Fast Matrix Operations