uva 11992 Fast Matrix Operations

这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作。代码如下:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 const int maxn=1000000+5;
  6 const int  INF=1000000009;
  7 int sum[maxn<<2];
  8 int maxv[maxn<<2];
  9 int minv[maxn<<2];
 10 int add[maxn<<2];
 11 int setv[maxn<<2];
 12 int ansmin,ansmax;
 13 int row,col;
 14 void PushUp(int rt)
 15 {
 16    maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
 17    minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
 18    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 19 }
 20 void PushDown(int rt,int len)
 21 {
 22     if(setv[rt]>=0)
 23     {
 24         add[rt<<1]=add[rt<<1|1]=0;//这一步没写好啊,要为下面的add做准备。
 25         maxv[rt<<1]=minv[rt<<1]=maxv[rt<<1|1]=minv[rt<<1|1]=setv[rt];
 26         sum[rt<<1]=setv[rt]*(len-len/2);
 27         sum[rt<<1|1]=setv[rt]*(len/2);
 28         setv[rt<<1]=setv[rt<<1|1]=setv[rt];
 29         setv[rt]=-1;
 30     }
 31      if(add[rt])
 32      {
 33         sum[rt<<1]+=add[rt]*(len-len/2);
 34         maxv[rt<<1]+=add[rt];
 35         minv[rt<<1]+=add[rt];
 36         sum[rt<<1|1]+=add[rt]*(len/2);
 37         maxv[rt<<1|1]+=add[rt];
 38         minv[rt<<1|1]+=add[rt];
 39         add[rt<<1]+=add[rt];
 40         add[rt<<1|1]+=add[rt];
 41         add[rt]=0;
 42      }
 43 }
 44 void build(int l,int r,int rt)
 45 {
 46     if(l==r)
 47     {
 48         sum[rt]=maxv[rt]=minv[rt]=0;
 49         return ;
 50     }
 51     int m=(l+r)>>1;
 52     build(l,m,rt<<1);
 53     build(m+1,r,rt<<1|1);
 54     PushUp(rt);
 55 }
 56 void update(int L,int R,int inc,int l,int r,int rt)
 57 {
 58   if(L<=l&&r<=R)
 59   {
 60       sum[rt]+=inc*(r-l+1);
 61       maxv[rt]+=inc;
 62       minv[rt]+=inc;
 63       add[rt]+=inc;
 64       return ;
 65   }
 66   PushDown(rt,r-l+1);
 67   int m=(l+r)>>1;
 68   if(L<=m) update(L,R,inc,l,m,rt<<1);
 69   if(R>m) update(L,R,inc,m+1,r,rt<<1|1);
 70   PushUp(rt);
 71 }
 72 void set_val(int L,int R,int v,int l,int r,int rt)
 73 {
 74   if(L<=l&&r<=R)
 75   {
 76       add[rt]=0;//这一步很重要
 77       maxv[rt]=minv[rt]=v;
 78       sum[rt]=(r-l+1)*v;
 79       setv[rt]=v;
 80       return;
 81   }
 82   PushDown(rt,r-l+1);
 83   int m=(l+r)>>1;
 84   if(L<=m) set_val(L,R,v,l,m,rt<<1);
 85   if(R>m) set_val(L,R,v,m+1,r,rt<<1|1);
 86   PushUp(rt);
 87 }
 88 int query(int L,int R,int l,int r,int rt)
 89 {
 90     if(L<=l&&r<=R)
 91     {
 92         ansmin=min(ansmin,minv[rt]);
 93         ansmax=max(ansmax,maxv[rt]);
 94         return sum[rt];
 95     }
 96     PushDown(rt,r-l+1);
 97     int m=(l+r)>>1;
 98     int ret=0;
 99     if(L<=m) ret+=query(L,R,l,m,rt<<1);
100     if(R>m) ret+=query(L,R,m+1,r,rt<<1|1);
101     return ret;
102 }
103 int main()
104 {
105     int m;
106     while(scanf("%d%d%d",&row,&col,&m)!=EOF)
107     {
108         memset(add,0,sizeof(add));
109         memset(setv,-1,sizeof(setv));
110         build(1,col*row,1);
111         int com;
112         int x1,y1,x2,y2,v;
113         while(m--)
114         {
115             scanf("%d",&com);
116             if(com==1)
117             {
118                 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v);
119                 for(int i=x1;i<=x2;i++)
120                  update((i-1)*col+y1,(i-1)*col+y2,v,1,col*row,1);
121             }
122             else if(com==2)
123             {
124                 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v);
125                  for(int i=x1;i<=x2;i++)
126                  set_val((i-1)*col+y1,(i-1)*col+y2,v,1,col*row,1);
127             }
128             else
129             {
130                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
131                  ansmax=-INF; ansmin=INF;
132                  int ans=0;
133                  for(int i=x1;i<=x2;i++)
134                  ans+=query((i-1)*col+y1,(i-1)*col+y2,1,col*row,1);
135                 printf("%d %d %d
",ans,ansmin,ansmax);
136             }
137         }
138     }
139     return 0;
140 }
原文地址:https://www.cnblogs.com/sooflow/p/3280189.html