Fast Matrix Operations

Posted zytwan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fast Matrix Operations相关的知识,希望对你有一定的参考价值。

有一个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
",all,minn,maxx);
161             }
162         }
163     }
164     return 0;
165 }

 

以上是关于Fast Matrix Operations的主要内容,如果未能解决你的问题,请参考以下文章

Fast Matrix Operations(UVA)11992

Fast Matrix Operations

luogu题解 UVA11992 Fast Matrix Operations

题解 UVA11992 Fast Matrix Operations

[uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)

HDU 4965 Fast Matrix Calculation(矩阵高速幂)